Possible Duplicate:
How do you close/hide the Android soft keyboard programmatically?
First thing first I already saw this thread. I tried the accepted methods given there, but nothing worked for me.
I have two screens in my app.
- First one has 2 EditText - 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 the Keyboard should be visible. This is my implementation (simplified by removing unnecessary/unrelated code).
#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 startup. And my design badly requires a keyboard there.
Now on to second page. As I already mentioned, I have a listView and EditText there. I want my keyboard to be hidden on startup only to appear when the 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 startup.
- On SecondPage I want the keyboard to be hidden first, only to appear when the user touches editText
And my problem is I am getting the exact opposite on both occasions. Hope someone faced this issue before. BTW I am testing on the simulator and HTC Desire phone.
#FINAL OUTCOME
Well, I got it working, with the help of all my 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); The second answer is provided by @Dyarish, In fact, he linked to another SOF thread, which I haven't seen before. But the funny thing is that this solution is given in the thread which I referenced at the 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 the first one certainly works. Also, @Dyarish's answer contains 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 EditTexts. 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 to all my other friends who tried to help me.