47

我在ActionBar中有一个searchView。我想在用户完成输入时关闭键盘。我曾在上搜索查看以下queryTextListener如何在Android 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中的searchView相关,或者两者都有关系。有没有人得到这个工作,或知道为什么它不工作?

回答

9

不知怎的,它的工作原理,如果你打电话

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

然后

otherWidget.requestFocus(); 
7

对于我来说,下面的工作:

在我的活动我有一个成员变量

private SearchView mSearchView; 

In 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只是这样做,并且不会删除键盘。实际上,深入研究源代码,yuku提出了相同的建议,但仍然更喜欢我的解决方案,因为我不必陷入这些低级别的问题。

1

在平板电脑应用我工作的一个双窗格的活动,我只写了

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

这就够了搜索后驳回软键盘。无需使用InputMethodManager

59

我试图做类似的事情。我需要从另一个Activity启动SearchActivity,并在加载时使搜索字词显示在打开的搜索字段中。我尝试了所有的方法之上,但最终(类似于Ridcully's answer above)的变量I在onCreateOptionsMenu()SearchView设置为SearchView,然后在onQueryTextSubmit()称为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; 
} 
+0

是'query''在''onCreateOptionsMenu''定义其中'? –

+0

..这是在别处定义的查询字符串。我会编辑它。该行也不是必需的,只有在您想要预先填充查询时,第二个参数(false)才会停止运行查询。 – bkurzius

+1

非常感谢! searchView.clearFocus()是我到目前为止丢失的部分 – satyadeepk

1

我用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(); 
    } 

希望它有帮助。

1

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

@Override 
     public boolean onQueryTextSubmit(String query) { 

        searchView.clearFocus(); 
      return false; 
     } 

Original Answer:我编程使用setOnQueryTextListener。当searchview被隐藏时,键盘消失,然后当它再次可见时,键盘不会弹出。

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

    }); 
+0

为什么使用幻数而不是常量本身?此外,这只是一个黑客的答案。 –

24

简单,开门见山,清洁:

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

这应该是被接受的答案 – AlexF11

+3

如果'SearchView'为空,则不会调用... – Sakiboy

11

只是onQueryTextSubmit返回false就像下面

,使用工作对我来说,第一个
@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 
0

两种解决方案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); 
} 
6

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

下面的代码为我工作,以隐藏键盘搜索查看

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