如何检测SearchView的后退按钮?

我正在使用单个活动来显示SearchView以及显示搜索结果。 搜索结果只是项目的子集,因此搜索充当filter。 一切似乎都运行正常,但是当我点击SearchView的后退按钮时,我无法弄清楚如何恢复视图中的所有项目。

或者可能有另一种方法来检测用户何时从搜索结果导航到上一个视图(在我的情况下,是同一个视图)。

谢谢

因此,查看问题的标题,您不确定如何检测SearchView何时关闭,因此当SearchView不再打开时,您无法将视图恢复到“正常”状态。

Android 4.0及更新的过时解决方案

(简单)解决方案是将SearchView.OnCloseListener添加到SearchView ,如下所示:

 SearchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { // This is where you can be notified when the `SearchView` is closed // and change your views you see fit. } }); 

编辑

更新的解决方案适用于Android 4.0+

显然, OnCloseListener是错误的,并且不适用于较新版本的Android(4.0+)。 请参阅: https : //code.google.com/p/android/issues/detail?id = 25758

解决方案是使用SearchView的支持库版本:

我的onCreateOptionsMenu看起来像这样:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); MenuItem searchMenuItem = menu.findItem(R.id.searchView); SearchView searchView = (SearchView) searchMenuItem.getActionView(); MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(ScrollingActivity.this, "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(ScrollingActivity.this, "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show(); return true; } }); } 

至于为什么谷歌甚至不愿意在我不知道的文档中写评论,但它很难过。

编辑2

只需在评论中添加@MateiRadu添加的链接:

如何在android中处理Search View的后退按钮

这还显示了如何使用OnActionExpandListener而不是OnCloseListener

希望这可以帮助。

Darwind的答案将完成这项工作但只有当用户按下后退按钮关闭键盘并且SearchView不再具有焦点时才会起作用。

更好的方法是监听SearchView的文本更改。
这样,您可以在文本更新时恢复视图和控制UI。
这是我如何做到的。

 SearchView searchView = new SearchView(context); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // this is when user is done typing and clicks search return false; } @Override public boolean onQueryTextChange(String newText) { // you can use this to do a "live" search while the user is typing. // this will trigger each time user changes (adds or removes) text // so when newText is empty, restore your views return false; } }); 

还有一个技巧:

 searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() { @Override public void onSearchViewShown() { if(!txtToolbarTitle.getText().toString().isEmpty()){ searchView.setQuery(txtToolbarTitle.getText().toString()+ " ", false); } } @Override public void onSearchViewClosed() { if(txtToolbarTitle.getText().toString().isEmpty()){ finish(); } } }); 
 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); MenuItem searchItem = menu.findItem(R.id.action_search); searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean newViewFocus) { if (!newViewFocus) { //Collapse the action item. searchItem.collapseActionView(); //Clear the filter/search query. myFilterFunction(""); } } }); return super.onCreateOptionsMenu(menu); }