【问题标题】:How to dismiss keyboard in Android SearchView?如何在 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 有关,或两者兼而有之。有没有人得到这个工作或知道为什么它不工作?

【问题讨论】:

    标签: android android-actionbar android-3.0-honeycomb 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 对我有用

                          【讨论】:

                            猜你喜欢
                            • 2020-12-08
                            • 1970-01-01
                            • 2023-03-25
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-05-23
                            • 2016-05-19
                            • 1970-01-01
                            相关资源
                            最近更新 更多