如何检测 SearchView 的后退按钮按下?

How to detect SearchView's back button press?

我正在使用一个 activity 来显示 SearchView 以及显示搜索结果。搜索结果只是项目的一个子集,因此搜索充当过滤器。一切似乎都正常,只是我不知道如何在单击 SearchView 的后退按钮时恢复视图中的所有项目。

或者也许有另一种方法可以检测用户何时从搜索结果导航到上一个视图(在我的例子中,是同一个视图)。

谢谢

因此,查看您的问题标题,您不确定如何检测 SearchView 何时关闭,因此您无法将视图恢复到 "normal" 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;
        }
    });
}

至于为什么 Google 甚至懒得在文档中写评论我不知道,但很难过。

EDIT2:

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

how to handle back button of Search View in android

这也展示了如何使用 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);
}

这里的所有代码都已弃用!你应该使用这样的东西。

final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) item.getActionView();

item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Toast.makeText(getActivity(), "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show();
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Toast.makeText(getActivity(), "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

希望对您有所帮助。