Как убрать клавиатуру в Android SearchView?

У меня есть searchView в ActionBar. Я хочу убрать клавиатуру, когда пользователь выполнил ввод. У меня есть следующий queryTextListener в searchView

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { // Do something return true; } @Override public boolean onQueryTextSubmit(String query) { showProgress(); // Do stuff, make async call getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); return true; } }; 

Основываясь на подобных вопросах, следующий код должен отклонять клавиатуру, но в этом случае она не работает:

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

Я также пробовал:

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 

Ни один из них не работает. Я не уверен, что это конкретная проблема Honeycomb, или если она связана с поисковым профилем в ActionBar или с обоими. Кто-нибудь получил эту работу или знал, почему она не работает?

Solutions Collecting From Web of "Как убрать клавиатуру в Android SearchView?"

Я пытался сделать что-то подобное. Мне нужно было запустить SearchActivity из другого Activity и при его загрузке в открывшемся поле поиска SearchActivity поиска. Я пробовал все вышеприведенные подходы, но, наконец, (как и в ответе SearchView выше ), я установил переменную в SearchView в onCreateOptionsMenu() а затем в onQueryTextSubmit() называемую clearFocus() в SearchView когда пользователь отправил новый поиск:

 private SearchView searchView; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); searchView = (SearchView) menu.findItem(R.id.menu_search) .getActionView(); // set the reference to the searchView searchView.setOnQueryTextListener(this); searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); searchMenuItem.expandActionView(); // expand the search action item automatically searchView.setQuery("<put your search term here>", false); // fill in the search term by default searchView.clearFocus(); // close the keyboard on load return true; } @Override public boolean onQueryTextSubmit(String query) { performNewSearch(query); searchView.clearFocus(); return true; } 

Простой, прямолинейный и чистый:

  @Override public boolean onQueryTextSubmit(String query) { // your search methods searchView.clearFocus(); return true; } 

Как-то это работает, если вы позвоните

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 

а потом

 otherWidget.requestFocus(); 

Просто верните false на onQueryTextSubmit, как показано ниже.

 @Override public boolean onQueryTextSubmit(String s) { return false; } 

Для меня следующие работы:

В моей деятельности у меня есть переменная-член

 private SearchView mSearchView; 

В onCreateOptionsMenu() я установил такую ​​переменную следующим образом:

 public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.library, menu); mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView(); mSearchView.setOnQueryTextListener(this); return true; } 

В QueryTextListener наконец, я делаю это:

 mSearchView.setQuery("", false); mSearchView.setIconified(true); 

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

Для меня никто из вышеперечисленных не работал над первой подачей. Он скрывался, а затем сразу же показывал клавиатуру. Мне пришлось опубликовать clearFocus() в обработчике вида, чтобы это произошло после того, как все было сделано.

 mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { if (!"".equals(query)) { mSearchView.post(new Runnable() { @Override public void run() { mSearchView.clearFocus(); } }); } return true; } @Override public boolean onQueryTextChange(String newText) { return false; } }); 

В приложении для планшетов, над которым я работаю с двойной панелью, я написал только

f.getView().requestFocus(); // f is the target fragment for the search

И этого было достаточно, чтобы убрать мягкую клавиатуру после поиска. Нет необходимости использовать InputMethodManager

Я использовал ActionBarSherlock 4.3, и у меня есть ProgressDialog. Когда я отклоняю его в методе postExecute, фокус поиска Searchview. Чтобы исправить это:

 //Handle intent and hide soft keyboard @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); searchView.setQuery("", false); searchView.setIconified(true); searchView.clearFocus(); } /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/ AsyncTask.onPostExecute(){ if(pd!=null) pd.dismiss(); if(searchView!=null) searchView.clearFocus(); } 

Надеюсь, поможет.

Изменить: я добавил лучшее решение сверху, но также сохранил старый ответ в качестве ссылки.

  @Override public boolean onQueryTextSubmit(String query) { searchView.clearFocus(); return false; } 

Исходный ответ: Я запрограммировал использование setOnQueryTextListener. Когда поиск скрыт, клавиатура уходит, а затем, когда она снова видна, клавиатура не появляется.

  //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 */ searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); return false; } }); 

Два решения, которые работали для меня, первый с использованием экземпляра SearchView:

 private void hideKeyboard(){ InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); } 

Второе решение:

 private void hideKeyboard(){ InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } 

Ниже код работает для меня, чтобы скрыть клавиатуру в Searchview

 MenuItem searchItem = baseMenu.findItem(R.id.menuSearch); edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text); MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { edtSearch.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0); } }); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { return true; } });