如何在Android SearchView中closures键盘?

我在ActionBar中有一个searchView。 我想在用户完成input时closures键盘。 我在searchView上有以下queryTextListener

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

基于类似的问题,下面的代码应该closures键盘,但在这种情况下不起作用:

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

我也试过:

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

两者都没有工作。 我不确定这是否是Honeycomb特定的问题,或者它是否与ActionBar中的searchView相关。 有没有人得到这个工作,或知道为什么它不工作?

我正在尝试做类似的事情。 我需要从另一个Activity启动SearchActivity ,并在加载时在已打开的search字段中显示search词。 我尝试了上述所有方法,但最后(类似于Ridcully上面的回答 )我在onCreateOptionsMenu()设置一个variables给SearchView ,然后在用户提交一个新的search时,在SearchView上调用clearFocus()

 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(); 

就像下面的onQueryTextSubmit返回false

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

对我来说,以下作品:

在我的活动中,我有一个成员variables

 private SearchView mSearchView; 

onCreateOptionsMenu()我设置variables像这样:

 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的源代码,如果你没有将查询文本重置为空string,SearchView只是这样做,并不会删除键盘。 实际上,深入研究源代码,yuku提出了相同的build议,但是我仍然喜欢我的解决scheme,因为我不必陷入这些低级别的东西。

对我而言,以上都没有在第一次提交工作。 这是隐藏,然后立即重新显示键盘。 我必须在视图的处理程序上发布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

而且这足以在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(); } 

希望能帮助到你。

编辑:我在顶部添加了更好的解决scheme,但也保留旧的答案作为参考。

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

原来的答案:我编程使用setOnQueryTextListener。 当searchview被隐藏时,键盘消失,然后当它再次可见时,键盘不会popup。

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

两种解决scheme适用于我,第一种使用SearchView实例:

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

解决scheme二

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

下面的代码正在为我隐藏键盘在search视图

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