Отображение мягкой клавиатуры для SearchView на ActionBar

У нас есть SearchView на ActionBar, который настроен так, чтобы он не был обозначен. Поскольку у нас нет какого-либо контента в представлении до тех пор, пока пользователь не введет что-то для поиска, было бы целесообразно дать начальную ориентацию SearchView и убедиться, что мягкая клавиатура готова для ввода текста пользователем, Всегда нужно сначала нажать в SearchView.

Я могу дать фокусу SearchView, просто позвонив

searchView.requestFocus(); 

Но я не могу получить мягкую клавиатуру. В другом из наших фрагментов у меня есть EditText, который мы хотим сосредоточить. Я могу заставить мягкую клавиатуру появиться там, позвонив

 InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService( Context.INPUT_METHOD_SERVICE); mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 

Но это просто не работает в SearchView. Должно быть, это возможно, чтобы заставить это работать.

Дальше рылся вокруг StackOverflow, и я нашел этот вопрос:

Выключение мягкой клавиатуры

Который содержит решение, которое сработало для меня:

 ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)). toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

Я использую SearchView с setIconifiedByDefault (false). Тестирование с Android 4.4.2, единственный способ, которым я мог заставить клавиатуру фактически показать, – это посмотреть исходный код SearchView и подражать тому, как он запрашивал клавиатуру. Я пробовал буквально каждый другой метод, который я мог найти / подумать, и это единственный способ, которым я мог бы надежно показать клавиатуру. К сожалению, мой метод требует некоторого размышления.

В onCreateOptionsMenu (Меню):

 searchView.requestFocus(); searchView.post(new Runnable() { @Override public void run() { showSoftInputUnchecked(); } }); 

А затем создайте метод вызова скрытого метода «showSoftInputUnchecked» в InputMethodManager:

 private void showSoftInputUnchecked() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { Method showSoftInputUnchecked = null; try { showSoftInputUnchecked = imm.getClass() .getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class); } catch (NoSuchMethodException e) { // Log something } if (showSoftInputUnchecked != null) { try { showSoftInputUnchecked.invoke(imm, 0, null); } catch (IllegalAccessException e) { // Log something } catch (InvocationTargetException e) { // Log something } } } } 

Как и во всех решениях, которые используют методы доступа не в общедоступном API, я не могу обещать, что это не сломается с новыми версиями Android.

Попробуйте подключить onFocusChangeListener к вашему SearchView – он работал для меня с помощью EditText :

 searchView.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } }); 

Также убедитесь, что в xml нет тега фокуса запроса в SearchView , иначе ваш слушатель не будет вызываться.

Это сработало для меня.

 private SearchView mSearchView; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); MenuItem searchItem = menu.findItem(R.id.action_search); mSearchView = (SearchView) searchItem.getActionView(); mSearchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_search) { mSearchView.setIconifiedByDefault(true); mSearchView.setFocusable(true); mSearchView.setIconified(false); mSearchView.requestFocusFromTouch(); } return super.onOptionsItemSelected(item); } 

Используйте метод expandView: ваш onCreateOptionsMenu может быть примерно таким:

  @Override public boolean onCreateOptionsMenu(Menu menu) { //Used to put dark icons on light action bar final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); MenuItem mitem = menu.add("Search"); mitem.setIcon(ic_search_inverse) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); mitem.expandActionView(); listsearch.setOnItemClickListener(this); return true; } 

Вы можете попробовать, что я сделал. Это сработало для меня.

  //set query change listener searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure keyboard disappears when query is submitted * 4 = INVISIBLE * 0 = VISIBLE */ searchView.setVisibility(4); searchView.setVisibility(0); return false; } });