I am using Jake Wharton's excellent ActionBarSherlock library and have a collapsible search action view. I want to popup the soft keyboard when the search action view is expanded.
We can read a recommended way of doing this in a DialogFragment in the "Using DialogFragments" blog post by Google (altered a bit for readability).
// Show soft keyboard automatically
mEditText.requestFocus();
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getDialog().getWindow().setSoftInputMode(mode);
This does not seem to work when expanding and requesting focus on a collapsable EditText action view. I currently have this.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.my_activity, menu);
MenuItem menuItem = menu.findItem(R.id.menu_search);
final EditText searchText = (EditText) menuItem.getActionView();
menuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchText.requestFocus();
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getWindow().setSoftInputMode(mode);
return true; // Return true to expand action view
}
});
}
Here's my menu item definition in the my_activity menu xml file:
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_menu_search"
android:actionLayout="@layout/collapsible_edittext"
android:showAsAction="always|collapseActionView"
android:title="@string/menu_search"/>
... and the collapsible_edittext action layout
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_search"
android:imeOptions="actionSearch"
android:inputType="text"
android:focusable="true"
android:focusableInTouchMode="true" />
Caveat: I do not want to force the soft keyboard. When the user has a hardware keyboard requesting focus is sufficient.
Any thoughts anyone?
For an easier implementation of a collapsible search item in your ActionBar, you may simply use
SearchView
which is also available in ActionBarSherlock (com.actionbarsherlock.widget.SearchView
).It comes with many handy methods and handles showing/hiding the software keyboard on expanding/collapsing the view automatically. Plus, it is easier to define what to do on submitting the search. Just take a look at all the listeners you can set on that
SearchView
.Here's an example:
Another good reason: I had some layout issues on older devices when using a custom
EditText
as my search view (like you did in your question). The defaultSearchView
solved all these issues and saved me many lines of code.Works for me too!
For Collapsing ActionView and hiding Keyboard I use:
Set Listener to capture search button (or any other) press on soft keyboard, then use
collapseActionView()
:Then write keyboard hiding code in
onMenuItemActionCollapse()
method.Maybe the requestFocus never occurred in the code in the question because the searchText was not expanded yet? I don't know, anyway... this worked for me: