如何在 Android SearchView 中关闭键盘?

Posted

技术标签:

【中文标题】如何在 Android SearchView 中关闭键盘?【英文标题】:How to dismiss keyboard in Android SearchView? 【发布时间】:2011-11-16 13:56:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我正在尝试做类似的事情。我需要从另一个Activity 启动SearchActivity,并在加载时让搜索词出现在打开的搜索字段中。我尝试了上述所有方法,但最后(类似于Ridcully's answer above)我在onCreateOptionsMenu() 中将一个变量设置为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;

【讨论】:

queryonCreateOptionsMenu 中定义在哪里? ..这是在别处定义的查询字符串。我会编辑它。该行也不需要,仅当您想预填充查询并且第二个参数 (false) 阻止它运行查询时。 非常感谢! searchView.clearFocus() 是我目前缺少的部分 不要使用searchView.clearFocus() ,因为下一个视图会以动画为焦点(我认为你不想这样做) 你应该返回 false【参考方案2】:

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

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

【讨论】:

根据文档,这应该是正确的答案,返回布尔值:如果查询已由侦听器处理,则返回 true,返回 false 则让 SearchView 执行默认操作。 developer.android.com/reference/android/widget/… 不要使用searchView.clearFocus() ,因为下一个视图会以动画为焦点(我认为你不想这样做) 你应该返回 false【参考方案3】:

在 onQueryTextSubmit 上返回 false,如下所示

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

【讨论】:

@lostintranslation 因为这是正常的 UI 行为【参考方案4】:

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

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

然后

otherWidget.requestFocus();

【讨论】:

【参考方案5】:

对我来说,上述方法都不适用于第一次提交。它隐藏起来,然后立即重新显示键盘。我必须在视图的处理程序上发布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;
            
        );

【讨论】:

【参考方案6】:

对我来说,以下工作:

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

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 建议,但我仍然更喜欢我的解决方案,因为我不必乱搞那些低级的东西。

【讨论】:

【参考方案7】:

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

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

     );

【讨论】:

你为什么使用幻数,而不是常量本身?此外,这只是一个 hacky 答案。【参考方案8】:

如果有人正在寻找如何折叠搜索视图/键盘,请使用以下代码

     /*
        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
        
    )

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

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

希望对你有帮助。

【讨论】:

【参考方案11】:

你可以使用它。

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;
    

【讨论】:

【参考方案12】:

两个对我有用的解决方案,第一个使用 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);
 

【讨论】:

【参考方案13】:

下面的代码可以让我在 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;
                        
                    );

【讨论】:

【参考方案14】:

你为什么不试试这个?当您触摸 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();
            
        );

【讨论】:

【参考方案15】:
fun View.hideKeyboard() 
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)

【讨论】:

【参考方案16】:
 @Override
    public void onResume() 
        super.onResume();
        searchView.clearFocus();
    

我尝试了上述所有答案,但没有一个有效,清除焦点 onResume 对我有用

【讨论】:

以上是关于如何在 Android SearchView 中关闭键盘?的主要内容,如果未能解决你的问题,请参考以下文章

如何在工具栏 Android 中使用 SearchView

如何在 Android 中展开的 SearchView(显示 10 个最近搜索)下方添加一个按钮(如“清除历史记录”)?

如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?

如何更改SearchView上的默认图标,以便在Android的操作栏中使用?

Android SearchView 图标

在 Android 操作栏中设置 SearchView 的样式