Programmatically Hide/Show Android Soft Keyboard

Possible Duplicate:
Close/hide the Android Soft Keyboard

First thing first I already saw this thread. I tried accepted methods given there..But nothing worked for me..

I have two screens in my app.

  • First one have 2 EditText's - One for username and one for password
  • Second one have one ListView, and an EditText - to filter the listView
  • In my first screen, I want username EditText to have focus on startup and Keyboard should be visible ..This is my implementation (simplified by removing unnecessary/unrelated codes)..

    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()
    }
    

    Well, the keyboard is not showing at start up . And my design badly require a keyboard there..

    Now on to second page ..I already said I have a listView and EditText there.. I want my keyboard to be hidden on start up only to appear when user touches the editText ..Can you believe it? whatever I tried soft Keyboard is showing when I load the activity ..I am not able to hide it..

    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);
       }
    }
    

    To simplify

  • On Login Page (first Page) I want my keyboard to be visible on start up..
  • On SecondPage I want keyboard to be hidden first, only to appear when user touches editText
  • And my problem is I am getting exact opposite on both occasion ...Hope someone faced this issue before..BTW I am testing on simulator and HTC Desire phone..

    FINAL OUTCOME

    Well I got it working, with the help of all friends here.

    1. To Show keyboard on startup

    Two answers worked for me. One provided by @CapDroid, which is to use a handler and post it delayed..

    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);
    

    Second answers is provided by @Dyarish, In fact he linked to another SO thread, which I haven't seen before. But the funny thing is that, this solution is given in the thread which I referenced at start. And I haven't tried it out because it had zero votes in a thread where all other posts have plenty of votes..Height of foolishness..

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

    For me the second solution looked neat, so I decided to stick with it..But first one certainly works. Also @Dyarish's answer contain a clever hack of using a ScrollView below EditText to give EditText the focus..But I haven't tried it, but it should work. Not neat though..

    2. To hide keyboard at activity start

    Only one answer worked for me, which is provided by @Dyarish. And the solution is to use focusableInTouchMode settings in xml for the layout containing the editText's. This did the trick

    <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> 
    

    Anyway I end up using Dyarish's answer in both cases. So I am awarding the bounty to him..Thanks all other friends who tried to help me..


    Adding this to your code android:focusableInTouchMode="true" will make sure that your keypad doesn't appear on startup for your edittext box. You want to add this line to your linear layout that contains the EditTextBox. You should be able to play with this to solve both your problems. I have tested this. Simple solution.

    ie: In your app_list_view.xml file

    <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> 
    

    ------------------ EDIT: To Make keyboard appear on startup -----------------------

    This is to make they Keyboard appear on the username edittextbox on startup. All I've done is added an empty Scrollview to the bottom of the .xml file, this puts the first edittext into focus and pops up the keyboard. I admit this is a hack, but I am assuming you just want this to work. I've tested it, and it works fine.

    <?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>
    

    If you are looking for a more eloquent solution, I've found this question which might help you out, it is not as simple as the solution above but probably a better solution. I haven't tested it but it apparently works. I think it is similar to the solution you've tried which didn't work for you though.

    Hope this is what you are looking for.

    Cheers!


    UPDATE 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
        }
    

    I tried very hard and found out a solution ... whenever a new activity starts then keyboard cant open but we can use Runnable in onResume and it is working fine so please try this code and check...

    UPDATE 1

    add this line in your AppLogin.java

    mUserNameEdit.requestFocus();
    

    and this line in your AppList.java

    listview.requestFocus()'
    

    after this check your application if it is not working then add this line in your AndroidManifest.xml file

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

    ORIGINAL ANSWER

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

    for hide keyboard

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

    for show keyboard

     imm.showSoftInput(ed, 0);
    

    for focus on EditText

     ed.requestFocus();
    

    where ed is EditText


    Try this code.

    For showing Softkeyboard:

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

    For Hiding SoftKeyboard -

    InputMethodManager imm = (InputMethodManager)
                                      getSystemService(Context.INPUT_METHOD_SERVICE);
    if(imm != null){
            imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
        }
    
    链接地址: http://www.djcxy.com/p/2722.html

    上一篇: 在活动状态onStop上关闭/隐藏Android软键盘

    下一篇: 以编程方式隐藏/显示Android软键盘