Ответ 1
Основываясь на ответе @MarcinOrlowski, вы также можете использовать:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
}
}
В настоящее время у меня есть 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);
}
Основываясь на ответе @MarcinOrlowski, вы также можете использовать:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
}
}
не используется
searchView.setIconifeid(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 свернуть до того, как вы нажмете назад, тогда вызывается обратное действие.
Оба решения будут работать.
Чтобы перехватить кнопку 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.
это единственное, что делает это для меня:
toolbar.collapseActionView();
если у вас есть вход в searchView
mSearchView.setIconified(true);
удалит только текст.
Правильный метод закрытия searchView -
mSearchView.onActionViewCollapsed();
Использование:
searchView.setIconified(true);
Я предпочитаю ! SearchView.isIconified() над if (isSearchViewVisible) внутри метода onBackPressed(), так как опция 2 не работает, когда у вас есть фрагменты, добавленные в стопку backman, который вы хотите показать при нажатии кнопки "Назад".
Мой способ:
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); } }
<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 searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();
Если вы не используете какую-либо функцию в методе 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"/>
Также вы можете использовать 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" />