Как обнаружить кнопку возврата в SearchView?

Я использую одно действие для отображения SearchView, а также для отображения результатов поиска. Результаты поиска - это всего лишь подмножество элементов, поэтому поиск действует как фильтр. Кажется, что все работает нормально, за исключением того, что я не могу понять, как восстановить все элементы в представлении, когда нажата кнопка "Назад" в SearchView.

Или, может быть, есть еще один способ определить, когда пользователь переходит от результатов поиска к предыдущему представлению (что в моем случае является одним и тем же представлением).

Спасибо

Ответ 1

Итак, глядя на заголовок вашего вопроса, вы не знаете, как определить, когда закрывается 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;
        }
    });
}

Что касается того, почему Google даже не потрудился написать комментарий в документации, я не знаю, но это печально.

EDIT2

Просто добавив ссылку, которую @MateiRadu добавил в комментарии:

как обращаться с кнопкой возврата в Search View в андроиде

Это также показывает, как использовать OnActionExpandListener вместо OnCloseListener.

Надеюсь, что это поможет.

Ответ 2

Ответ Darwind выполнит эту работу, но это работает только тогда, когда пользователь нажимает кнопку "Назад", чтобы закрыть клавиатуру, и когда SearchView больше не имеет фокуса.

Лучший способ сделать это - прослушать текстовые изменения SearchView.
Таким образом, вы можете восстановить представления и управлять пользовательским интерфейсом при обновлении текста.
вот как я это делаю.

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

Ответ 3

Есть еще один трюк:

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