Как я могу сосредоточиться на элементе EditText в виде разворачиваемого действия в панели действий (когда он расширен) и заставить открывать мягкую клавиатуру?

Я использую отличную библиотеку ActionBarSherlock от Джейка Уортона и имеет сводный вид действий поиска. Я хочу всплывать на мягкой клавиатуре при расширении вида действия поиска.

Мы можем прочитать рекомендуемый способ сделать это в диалоговом окне « Диалоговое окно » в блоге « Использование диалоговых окон » от Google (немного изменилось для удобочитаемости).

// Show soft keyboard automatically mEditText.requestFocus(); int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE; getDialog().getWindow().setSoftInputMode(mode); 

Кажется, что это не работает при расширении и обращении с просьбой сосредоточиться на сворачивающемся представлении действий EditText . В настоящее время у меня это есть.

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

Вот мое определение пункта меню в файле xml файла my_activity:

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

… и макет действия collapsible_edittext

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

Предостережение: я не хочу принуждать мягкую клавиатуру. Когда пользователь имеет аппаратную клавиатуру с запросом фокуса, достаточно.

Кто-нибудь думает?

Solutions Collecting From Web of "Как я могу сосредоточиться на элементе EditText в виде разворачиваемого действия в панели действий (когда он расширен) и заставить открывать мягкую клавиатуру?"

Может быть, requestFocus никогда не возникал в коде в вопросе, потому что searchText еще не был расширен? Во всяком случае, я не знаю … это сработало для меня:

 @Override public boolean onMenuItemActionExpand(MenuItem item) { searchText.post(new Runnable() { @Override public void run() { searchText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT); } }); return true; // Return true to expand action view } 

Работает и для меня!

Для сворачивания ActionView и сокрытия клавиатуры я использую:

Set Listener для захвата кнопки поиска (или любого другого) нажмите на мягкую клавиатуру, затем используйте collapseActionView() :

 searchText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { searchMenuItem.collapseActionView(); return true; } return false; } }); 

Затем напишите код скрытия клавиатуры в onMenuItemActionCollapse() .

 public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed searchText.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchText.getWindowToken(), 0); } }); return true; // Return true to collapse action view } 

Для более простой реализации SearchView элемента поиска в ActionBar вы можете просто использовать SearchView который также доступен в ActionBarSherlock ( com.actionbarsherlock.widget.SearchView ).

Он поставляется с множеством удобных методов и ручек, показывающих / скрывающих клавиатуру программного обеспечения при автоматическом расширении / сведении вида. Кроме того, легче определить, что делать при отправке поиска. Просто взгляните на всех слушателей, которых вы можете установить на этом SearchView .

Вот пример:

 @Override public boolean onCreateOptionsMenu(Menu menu) { SearchView searchView = new SearchView(this); searchView.setQueryHint(getString(R.string.search_hint)); searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // what to do on submit, eg start an Activity and pass the query param return true; } @Override public boolean onQueryTextChange(String newText) { return false; } }); menu.add(getString(R.string.search_title)) .setIcon(R.drawable.ic_action_search) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); // ...place to add other menu items return super.onCreateOptionsMenu(menu); } 

Еще одна веская причина: у меня были некоторые проблемы с EditText на более старых устройствах, когда вы использовали пользовательский EditText качестве моего вида поиска (например, в вашем вопросе). По умолчанию SearchView решил все эти проблемы и сохранил много строк кода.