如何检测 SearchView 的后退按钮按下?
How to detect SearchView's back button press?
我正在使用一个 activity 来显示 SearchView 以及显示搜索结果。搜索结果只是项目的一个子集,因此搜索充当过滤器。一切似乎都正常,只是我不知道如何在单击 SearchView 的后退按钮时恢复视图中的所有项目。
或者也许有另一种方法可以检测用户何时从搜索结果导航到上一个视图(在我的例子中,是同一个视图)。
谢谢
因此,查看您的问题标题,您不确定如何检测 SearchView
何时关闭,因此您无法将视图恢复到 "normal" 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 在评论中添加的 link:
how to handle back button of Search View in android
这也展示了如何使用 OnActionExpandListener
而不是 OnCloseListener
。
希望这对您有所帮助。
Darwind 的答案将完成这项工作,但只有当用户按下后退按钮关闭键盘并且 SearchView
不再具有焦点时才有效。
更好的方法是监听 SearchView
的文本变化。
这样您就可以在文本更新时恢复视图和控制 UI。
这是我的做法。
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);
}
这里的所有代码都已弃用!你应该使用这样的东西。
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) item.getActionView();
item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(getActivity(), "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(getActivity(), "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show();
return true;
}
});
希望对您有所帮助。
我正在使用一个 activity 来显示 SearchView 以及显示搜索结果。搜索结果只是项目的一个子集,因此搜索充当过滤器。一切似乎都正常,只是我不知道如何在单击 SearchView 的后退按钮时恢复视图中的所有项目。
或者也许有另一种方法可以检测用户何时从搜索结果导航到上一个视图(在我的例子中,是同一个视图)。
谢谢
因此,查看您的问题标题,您不确定如何检测 SearchView
何时关闭,因此您无法将视图恢复到 "normal" 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 在评论中添加的 link:
how to handle back button of Search View in android
这也展示了如何使用 OnActionExpandListener
而不是 OnCloseListener
。
希望这对您有所帮助。
Darwind 的答案将完成这项工作,但只有当用户按下后退按钮关闭键盘并且 SearchView
不再具有焦点时才有效。
更好的方法是监听 SearchView
的文本变化。
这样您就可以在文本更新时恢复视图和控制 UI。
这是我的做法。
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);
}
这里的所有代码都已弃用!你应该使用这样的东西。
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) item.getActionView();
item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(getActivity(), "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(getActivity(), "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show();
return true;
}
});
希望对您有所帮助。