Подтвердить что ты не робот

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

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

// 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);
}
4b9b3361

Ответ 1

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

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

Ответ 2

не используется

searchView.setIconifeid(true)

Я также использовал MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)

Ответ 3

Существует простой способ сделать это:

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

или используйте:

@Override
public void onBackPressed() {
    searchView.onActionViewCollapsed();
    super.onBackPressed();
}

Это заставит searchView свернуть до того, как вы нажмете назад, тогда вызывается обратное действие.

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

Ответ 4

Чтобы перехватить кнопку BACK переопределить onBackPressed() (посмотреть документы)

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

ИЗМЕНИТЬ

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

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

Ответ 5

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

  toolbar.collapseActionView();

Ответ 6

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

mSearchView.setIconified(true);

удалит только текст.

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

mSearchView.onActionViewCollapsed();

Ответ 7

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

searchView.setIconified(true);

Ответ 8

Я предпочитаю   ! SearchView.isIconified() над  if (isSearchViewVisible) внутри метода onBackPressed(), так как опция 2 не работает, когда у вас есть фрагменты, добавленные в стопку backman, который вы хотите показать при нажатии кнопки "Назад".

Ответ 9

Мой способ:

  • Создать класс 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();

Ответ 10

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

и my menu.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"/>

Ответ 11

Также вы можете использовать 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" />