Как закрыть SearchView программно?
в настоящее время у меня SearchView
в панели действий моего приложения. Когда я нажимаю на значок поиска SearchView
расширяет и клавиатура всплывает, как ожидалось. Нажав на " X " в 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);
}
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 () на пункт меню.
Если у вас есть вход на searchView
mSearchView.setIconified(true);
только четкий текст.
правильный метод для закрытия searchView является
mSearchView.onActionViewCollapsed();
предпочитаю
!searchView.isIconified()
overif(isSearchViewVisible)
внутриonBackPressed()
метод как вариант 2 не работает, когда у вас есть фрагменты, добавленные в вашfragmentmanager's
backstack
что вы хотели бы показать, когда кнопка Назад нажата.
мой путь:
- создать класс 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); } }
- добавить 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"/>
- создать 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" />