development

프로그래밍 방식으로 Android 소프트 키보드 숨기기 / 표시

big-blog 2020. 4. 15. 11:10
반응형

프로그래밍 방식으로 Android 소프트 키보드 숨기기 / 표시


가능한 중복 :
Android Soft Keyboard 닫기 / 숨기기

우선 먼저 나는 이미 보았다 스레드를. 나는 거기에 주어진 방법을 시도했다. 그러나 아무것도 나를 위해 일하지 않았다.

앱에 두 개의 화면이 있습니다.

  • 첫 번째는 2 개의 EditText를 가지고 있습니다-하나는 사용자 이름과 하나는 암호
  • 두 번째는 하나의 ListView와 EditText를 가지며 listView를 필터링합니다.

첫 번째 화면에서 사용자 이름 EditText가 시작에 중점을두기를 원하고 키보드가 표시되어야합니다. 이것은 구현입니다 (불필요하거나 관련없는 코드를 제거하여 단순화 됨).

app_login.xml

<LinearLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">

    <EditText android:id="@+id/username" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" android:hint="Username"  
        android:imeOptions="actionDone" android:inputType="text"
        android:maxLines="1"/>

    <EditText android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"    
        android:hint="Password" />
</LinearLayout>

AppLogin.java

class AppLogin extends Activity{
    private EditText mUserNameEdit = null;
    private EditText mPasswordEdit = null;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_login);

        mUserNameEdit  =    (EditText) findViewById(R.id.username);
        mPasswordEdit  =    (EditText) findViewById(R.id.password);

        /* code to show keyboard on startup.this code is not working.*/
        InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);

    }//End of onCreate()
}

글쎄, 시작할 때 키보드가 표시되지 않습니다 . 그리고 내 디자인에는 키보드가 심하게 필요합니다.

이제 두 번째 페이지로 .. 나는 이미 listView와 EditText가 있다고 말했습니다. 사용자가 editText를 터치 할 때만 키보드가 숨겨 지기를 원합니다. 믿을 수 있습니까? 액티비티를로드 할 때 소프트 키보드를 사용 하려고하면 무엇이든 표시됩니다 . 숨길 수 없습니다.

app_list_view.xml

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" >

   <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout>     

AppList.java

public class MyListActivity extends ListActivity{
   private EditText mfilterEditText;

    @Override
   public void onCreate(Bundle savedInstanceState) {        
      super.onCreate(savedInstanceState);
      setContentView(R.layout.app_list_view);

      mFilterEditText  =  (EditText) findViewById(R.id.filter_edittext);
      InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0);
   }
}

단순화

  1. 로그인 페이지 (첫 페이지)에서 키보드를 시작할 때 보이기를 원합니다.
  2. SecondPage에서 키보드를 먼저 숨기고 사용자가 editText를 터치 할 때만 나타나기를 원합니다.

그리고 내 문제는 두 경우에 정확히 반대되는 것입니다 ... 누군가 가이 문제에 직면하기를 바랍니다 .BTW 시뮬레이터와 HTC Desire 전화에서 테스트하고 있습니다.

최종 결과

글쎄, 나는 모든 친구들의 도움으로 여기에서 일했다.

1. 시작시 키보드 표시

두 가지 대답이 나를 위해 일했습니다. @CapDroid에서 제공하는 것으로, 핸들러를 사용하여 지연 게시하는 것입니다.

mUserNameEdit.postDelayed(new Runnable() {
  @Override
  public void run() {
    // TODO Auto-generated method stub
    InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    keyboard.showSoftInput(mUserNameEdit, 0);
  }
},50);

두 번째 답변은 @Dyarish가 제공합니다. 실제로 그는 이전에 보지 못한 다른 SO 스레드에 연결되었습니다. 그러나 재미있는 점은이 솔루션이 처음에 참조 한 스레드에서 제공된다는 것입니다. 그리고 다른 모든 게시물에 많은 투표권이있는 스레드에서 투표가 0이기 때문에 시도하지 않았습니다 .. 어리 석음의 높이 ..

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

나에게 두 번째 해결책은 깔끔해 보였으므로 그것을 고수하기로 결정했다. 그러나 첫 번째 해결책은 확실히 작동한다. 또한 @Dyarish의 답변에는 EditText 아래에 ScrollView를 사용하여 EditText에 포커스를주는 영리한 해킹이 포함되어 있습니다.하지만 시도하지는 않았지만 작동해야합니다. 깔끔하지는 않지만 ..

2. 활동 시작시 키보드를 숨기려면

@Dyarish가 제공하는 답변은 하나뿐입니다. 그리고 해결책은 editText를 포함하는 레이아웃에 xml에서 focusableInTouchMode 설정을 사용하는 것입니다. 이 트릭을했다

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

어쨌든, 나는 두 경우 모두 Dyarish의 대답을 사용하게됩니다. 그래서 나는 그에게 현상금을 수여하고 있습니다. 나를 도와 주려는 다른 모든 친구들에게 감사합니다 ..


이것을 코드에 추가하면 android:focusableInTouchMode="true"편집 텍스트 상자를 시작할 때 키패드가 나타나지 않습니다. 이 줄을 EditTextBox가 포함 된 선형 레이아웃에 추가하려고합니다. 이 문제를 해결하기 위해이 문제를 해결할 수 있어야합니다. 나는 이것을 테스트했다. 간단한 해결책.

즉 : app_list_view.xml 파일에서

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText 
        android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" 
        android:inputType="text" 
        android:maxLines="1"/>
    <ListView 
        android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

------------------ 편집 : 시작시 키보드를 표시하려면 -----------------------

이것은 키보드를 시작할 때 사용자 이름 edittextbox에 키보드가 나타나도록하기위한 것입니다. 내가 한 모든 것은 빈 Scrollview를 .xml 파일의 맨 아래에 추가하면 첫 번째 편집 텍스트가 포커스되고 키보드가 나타납니다. 나는 이것이 해킹이라는 것을 인정하지만, 이것이 당신이 작동하기를 원한다고 가정합니다. 나는 그것을 테스트했고 잘 작동한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">
    <EditText 
        android:id="@+id/userName" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" 
        android:hint="Username"  
        android:imeOptions="actionDone" 
        android:inputType="text"
        android:maxLines="1"
       />
    <EditText 
        android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Password" />
    <ScrollView
        android:id="@+id/ScrollView01"  
        android:layout_height="fill_parent"   
        android:layout_width="fill_parent"> 
    </ScrollView>
</LinearLayout>

더 웅변적인 솔루션을 찾고 있다면 질문을 통해 도움이 될 수 있습니다. 위의 솔루션만큼 간단하지는 않지만 더 나은 솔루션 일 것입니다. 나는 그것을 테스트하지 않았지만 분명히 작동합니다. 나는 그것이 당신에게 시도하지 않은 솔루션과 유사하다고 생각합니다.

이것이 당신이 찾고있는 것이기를 바랍니다.

건배!


업데이트 2

@Override
    protected void onResume() {
        super.onResume();
        mUserNameEdit.requestFocus();

        mUserNameEdit.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                InputMethodManager keyboard = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(mUserNameEdit, 0);
            }
        },200); //use 300 to make it run when coming back from lock screen
    }

나는 매우 열심히 시도하고 해결책을 찾았습니다 ... 새로운 활동이 시작될 때마다 키보드를 열 수 없지만 onResume 에서 Runnable사용할 수 있으며 정상적으로 작동 하므로이 코드를 시도하고 확인하십시오 ...

업데이트 1

이 줄을 당신의 AppLogin.java

mUserNameEdit.requestFocus();

이 라인은 AppList.java

listview.requestFocus()'

이 후에 응용 프로그램이 작동하지 않는지 확인한 다음 AndroidManifest.xml파일 에이 줄을 추가 하십시오

<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>

원래 답변

 InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);

키보드 숨기기

 imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

쇼 키보드

 imm.showSoftInput(ed, 0);

EditText에 중점을 둡니다.

 ed.requestFocus();

ed는 EditText입니다.


이 코드를 사용해보십시오.

소프트 키보드 표시 :

InputMethodManager imm = (InputMethodManager)
                                 getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }

SoftKeyboard 숨기기-

InputMethodManager imm = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

InputMethodManager.SHOW_IMPLICIT첫 번째 창에서 시도 했습니까?

두 번째 창 사용에 숨어 InputMethodManager.HIDE_IMPLICIT_ONLY

편집 :

여전히 작동하지 않으면 잘못된 위치에 넣었을 것입니다. 무시 onFinishInflate()하고 표시 / 숨 깁니다.

@override
public void onFinishInflate() {
     /* code to show keyboard on startup */
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}

참고 URL : https://stackoverflow.com/questions/7200281/programmatically-hide-show-android-soft-keyboard


반응형