如何在Android SearchView中关闭键盘?

CAC*_*lan 57 android android-3.0-honeycomb android-actionbar searchview

我在ActionBar中有一个searchView.我想在用户完成输入时关闭键盘.我在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; 
    } 
};
Run Code Online (Sandbox Code Playgroud)

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)

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

bku*_*ius 65

我试图做类似的事情.我需要SearchActivity从另一个启动它,Activity并在加载时在打开的搜索字段中显示搜索词.我尝试了所有的方法之上,但最终(类似于上述Ridcully的回答)我设置一个变量SearchViewonCreateOptionsMenu(),然后在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;
}
Run Code Online (Sandbox Code Playgroud)


daz*_*ito 32

简单,直截了当,干净利落:

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


Plu*_*gie 22

只需在onQueryTextSubmit上返回false,如下所示

@Override
public boolean onQueryTextSubmit(String s) {
     return false;
}
Run Code Online (Sandbox Code Playgroud)


Ran*_*ku' 11

如果你打电话,它会以某种方式运作

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)

然后

otherWidget.requestFocus();
Run Code Online (Sandbox Code Playgroud)


Rid*_*lly 7

对我来说,以下工作:

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

private SearchView mSearchView;
Run Code Online (Sandbox Code Playgroud)

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;
}   
Run Code Online (Sandbox Code Playgroud)

QueryTextListener最后,我这样做:

mSearchView.setQuery("", false);
mSearchView.setIconified(true); 
Run Code Online (Sandbox Code Playgroud)

我看了一下SearchView的源代码,如果你没有将查询文本重置为一个空字符串,那么SearchView就是这样做了,并没有删除键盘.实际上,在源代码中深入挖掘,yuku建议,但我仍然更喜欢我的解决方案,因为我不必乱用那些低级别的东西.


Til*_*ill 7

对我来说,以上都没有在第一次提交时工作.它正在隐藏,然后立即重新显示键盘.我必须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;
            }
        });
Run Code Online (Sandbox Code Playgroud)