Как обнаружить кнопку Назад SearchView нажмите?
Я использую одно действие для отображения SearchView а также для отображения результатов поиска. Результаты поиска - это всего лишь подмножество элементов, поэтому поиск действует как фильтр. Кажется, все работает нормально, за исключением того, что я не могу понять, как восстановить все элементы в представлении при нажатии кнопки "Назад" SearchView.
или, возможно, есть другой способ определить, когда пользователь переходит от результатов поиска к предыдущему представлению (что, в моем случае, то же самое вид.)
спасибо
4 ответов
так, глядя на название вашего вопроса, Вы не знаете, как определить, когда 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 добавил в комментариях:
как обрабатывать кнопку Назад поиска в android
это также показывает, как использовать OnActionExpandListener
вместо OnCloseListener
.
надеюсь, что это помогает.
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;
}
});
есть еще один трюк:
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();
}
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean newViewFocus)
{
if (!newViewFocus)
{
//Collapse the action item.
searchItem.collapseActionView();
//Clear the filter/search query.
myFilterFunction("");
}
}
});
return super.onCreateOptionsMenu(menu);
}