70

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

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

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 有关,或两者兼而有之。有没有人得到这个工作或知道为什么它不起作用?

4

16 回答 16

71

我试图做类似的事情。我需要SearchActivity从另一个启动,Activity并在加载时让搜索词出现在打开的搜索字段中。我尝试了上述所有方法,但最后(类似于上面 Ridcully 的回答)我将变量设置为SearchViewin 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;
}
于 2013-02-28T04:02:17.567 回答
38

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

  @Override
  public boolean onQueryTextSubmit(String query) {
      // your search methods
      searchView.clearFocus();
      return true;
  }
于 2014-07-02T10:38:37.653 回答
28

就像下面一样在 onQueryTextSubmit 上返回 false

@Override
public boolean onQueryTextSubmit(String s) {
     return false;
}
于 2015-03-21T10:24:32.060 回答
11

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

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

接着

otherWidget.requestFocus();
于 2012-01-10T09:10:57.087 回答
11

对我来说,上述方法都不适用于第一次提交。它隐藏起来,然后立即重新显示键盘。我必须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;
            }
        });
于 2015-12-08T17:41:16.887 回答
7

对我来说,以下工作:

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

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 只会这样做,并且不会移除键盘。实际上,在源代码中深入研究,结果是一样的,yuku 建议,但我仍然更喜欢我的解决方案,因为我不必乱搞那些低级的东西。

于 2012-03-01T11:18:13.477 回答
3

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

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

     });
于 2013-08-20T16:21:11.253 回答
2

如果有人正在寻找如何折叠 searchView/keyboard,请使用下面的代码

     /*
        setup close button listener
     */
    searchView.findViewById<ImageView>(R.id.search_close_btn).setOnClickListener {
        adapter.filter(null)//reset default list
        searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
        true
    }

    /*
        setup text change listener
     */
    searchView.setOnQueryTextListener(object:SearchView.OnQueryTextListener{
        override fun onQueryTextSubmit(query: String?): Boolean {

            adapter.filter(if(query.isNullOrEmpty()) "" else query)

            searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            adapter.filter(if(newText.isNullOrEmpty()) "" else newText)
            return true
        }
    })
于 2019-12-06T06:55:16.847 回答
1

在我正在使用双窗格活动的平板电脑应用程序中,我只写了

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

这足以在搜索后关闭软键盘。无需使用 InputMethodManager

于 2012-07-08T06:07:21.040 回答
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();
    }

希望能帮助到你。

于 2013-06-12T14:57:03.880 回答
1

你可以使用它。

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}
于 2019-04-07T21:52:36.657 回答
0

下面的代码正在帮助我在 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;
                        }
                    });
于 2016-12-29T10:02:19.433 回答
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);
 }
于 2015-11-04T22:59:04.220 回答
0

你为什么不试试这个?当您触摸 X 按钮时,无论如何都会触发对搜索视图的关注。

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            }
        });
于 2018-06-14T20:08:20.483 回答
0
fun View.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}
于 2021-12-05T05:16:07.423 回答
-1
 @Override
    public void onResume() {
        super.onResume();
        searchView.clearFocus();
    }

我尝试了上面的所有答案,但都没有奏效,清除焦点 onResume 对我有用

于 2020-06-06T16:47:28.020 回答