如何以编程方式closuresSearchView?

我目前在我的应用程序的操作栏中有一个SearchView。 当我点击search图标时,SearchView会展开,并按预期popup键盘。 单击SearchView框中的“X”按预期closuresSearchView。 但是,当SearchView被激活,我按下“后退”button,我的应用程序退出。 这是正确的行为,但我现在要做的是捕获button按下,当SearchView可见时closuresSearchView(而不是我的应用程序)。 有没有一种方法来调用SearchView OnCloseListener()程序化的后退button按? 例如,像这样的东西:

// On a back button press, if we are currently searching, // close the SearchView. Otherwise, invoke normal back button // behavior. public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (isSearchViewVisible) { SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) .getActionView(); // This method does not exist searchView.invokeClose(); return true; } } return super.onKeyDown(keyCode, event); } 

基于@MarcinOrlowski的答案,你也可以使用:

 @Override public void onBackPressed() { if (!searchView.isIconified()) { searchView.setIconified(true); } else { super.onBackPressed(); } } 

超越使用

 searchView.setIconifeid(true) 

我也使用MenuItemCompat.collapseActionView

 MenuItemCompat.collapseActionView(menuItem) 

有一个简单的方法来做到这一点:

 @Override public void onBackPressed() { if (!searchView.isIconified()) { searchView.onActionViewCollapsed(); } else { super.onBackPressed(); } } 

或使用:

 @Override public void onBackPressed() { searchView.onActionViewCollapsed(); super.onBackPressed(); } 

这将使searchView崩溃之前,你按回来然后后面的行动将被调用。

这两个解决scheme将工作

拦截BACKbutton覆盖onBackPressed() ( 请参阅文档 )

 @Override public void onBackPressed() { if (isSearchViewVisible) { SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) .getActionView(); // This method does not exist searchView.invokeClose(); } else { super.onBackPressed(); } } 

编辑

文档说 :

如有必要,可以通过调用MenuItem上的expandActionView()和collapseActionView()来展开或折叠自己的代码中的操作视图。

这是我唯一能做到的事情:

  toolbar.collapseActionView(); 

如果你有你的searchViewinput

 mSearchView.setIconified(true); 

只会清除文字。

closuressearchView的正确方法是

 mSearchView.onActionViewCollapsed(); 

使用:

 searchView.setIconified(true); 

我更喜欢!searchView.isIconified()在onBackPressed()方法中的if(isSearchViewVisible)作为选项2不起作用,当您在fragmentmanager的后台堆栈中添加了片段,您希望在按下后退button时显示这些片段。

我的方式:

  1. 创buildCustomSearchView类

    公共类CustomSearchView扩展SearchView {
        公共CustomSearchView(最终的上下文上下文){
            超级(上下文);
             this.setIconifiedByDefault(真);
         }

         @覆盖
         public boolean dispatchKeyEventPreIme(KeyEvent event){
             if(event.getKeyCode()== KeyEvent.KEYCODE_BACK && 
                 event.getAction()== KeyEvent.ACTION_UP){
                 this.onActionViewCollapsed();
             }
            返回super.dispatchKeyEventPreIme(event);
         }
     }

  1. 添加actionViewClass
     <项目
        机器人:ID = “@ + ID / menu_search”
        机器人:标题= “@string/ menu_search”
        机器人:图标= “@绘制/ ic_search”
        机器人:showAsAction = “collapseActionView | ifRoom”
        机器人:actionViewClass = “com.myapp.CustomSearchView”/>
  1. 创buildCustomSearchView到onCreateOptionsMenu
     CustomSearchView searchView =(CustomSearchView)menu.findItem(R.id.menu_search).getActionView();

如果在onBackPressed()方法中没有使用任何函数, onBackPressed()其从Activity中移除,以使SearchView本身处理onBackPress事件。

我正在使用SearchView

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem); searchview.setIconifiedByDefault(true); searchview.setOnQueryTextListener(this); searchview.setSubmitButtonEnabled(true); searchview.setQueryHint("Search Here"); super.onCreateOptionsMenu(menu, inflater); } 

和我的menu.xml如下

 <item android:id="@+id/action_search" android:icon="@drawable/search_tool" android:orderInCategory="1" android:title="Search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always|collapseActionView"/> 

你也可以使用collapseActionView 。 它自动处理后退button,折叠SearchView

 <item android:id="@+id/action_search" android:icon="@drawable/ic_magnify" android:title="@string/action_title_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" />