Как закрыть SearchView программно?


в настоящее время у меня SearchView в панели действий моего приложения. Когда я нажимаю на значок поиска SearchView расширяет и клавиатура всплывает, как ожидалось. Нажав на " X " в SearchView Окно закрывает SearchView как ожидается. Однако, когда и я нажимаю кнопку "назад", приложение закрывается. Это правильное поведение, но то, что я пытаюсь сделать сейчас, это захватить кнопку назад и просто закрыть ее SearchView (Не мое приложение) когда SearchView видна. Быть там способ вызвать SearchViewOnCloseListener() программно на нажатие кнопки "Назад"? Например, что-то вроде этого:

// 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);
}
11 53

11 ответов:

на основе ответа @MarcinOrlowski, также вы можете использовать:

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

использовать

searchView.setIconified(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 свернуться, прежде чем вы нажмете назад, тогда будет вызвано действие назад.

оба решения будут работать.

для перехвата кнопки Назад переопределить onBackPressed() ( см. docs)

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

EDIT:

документы говорят:

при необходимости вы можете развернуть или свернуть представление действий в своем собственном код, вызывая expandActionView () и collapseActionView () на пункт меню.

это единственное, что делает это для меня:

  toolbar.collapseActionView();

Если у вас есть вход на searchView

mSearchView.setIconified(true);

только четкий текст.

правильный метод для закрытия searchView является

mSearchView.onActionViewCollapsed();

использование:

searchView.setIconified(true);

предпочитаю !searchView.isIconified() over if(isSearchViewVisible) внутри onBackPressed() метод как вариант 2 не работает, когда у вас есть фрагменты, добавленные в ваш fragmentmanager'sbackstack что вы хотели бы показать, когда кнопка Назад нажата.

мой путь:

  1. создать класс CustomSearchView

    public class CustomSearchView extends SearchView{
        public CustomSearchView(final Context context) {
            super(context);
            this.setIconifiedByDefault(true);
        }

        @Override
        public boolean dispatchKeyEventPreIme(KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && 
                event.getAction() == KeyEvent.ACTION_UP) {
                this.onActionViewCollapsed();
            }
            return super.dispatchKeyEventPreIme(event);
        }
    }

  1. добавить actionViewClass
    <item
        android:id="@+id/menu_search"
        android:title="@string/menu_search"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="com.myapp.CustomSearchView"/>
  1. создать CustomSearchView в onCreateOptionsMenu
    CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();

если вы не используете какую-либо функцию в onBackPressed() метод, удалите его из вашего Activity.So что за обработки 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);
}

и мое меню.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. Он автоматически обрабатывает кнопку Назад, сворачивая 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" />