How to detect SearchView's back button press?

bdristan picture bdristan · May 5, 2016 · Viewed 20k times · Source

I'm using a single activity to display SearchView as well as to display search results. The search results is just a subset of items so the search acts as a filter. Everything seems to work fine except that I can't figure out how to restore all items in the view when a back button of SearchView is clicked on.

Or maybe there is another way to detect when a user navigates from search results to the previous view (which, in my case, is the same view).

Thanks

Answer

Darwind picture Darwind · May 5, 2016

So looking at the title of your question, you're not sure how to detect when the SearchView is being closed and hence you're not able to restore your views to the "normal" state when the SearchView is not open anymore.

Outdated solution as of Android 4.0+

The (simple) solution is to add a: SearchView.OnCloseListener to your SearchView, like this:

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.
    }
});

EDIT:

Updated solution that works in Android 4.0+

Apparently the OnCloseListener is buggy and doesn't work on newer versions of Android (4.0+). See: https://code.google.com/p/android/issues/detail?id=25758

The solution to this is to use the Support library version of the SearchView:

My onCreateOptionsMenu looks like this:

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

As to why Google didn't even bothered to write a comment in the documentation I don't know, but it's sad.

EDIT2:

Just adding the link which @MateiRadu added in the comments:

how to handle back button of Search View in android

This also shows how to use the OnActionExpandListener instead of the OnCloseListener.

Hope this helps.