重置搜索小部件 (SearchView) 值
Posted
技术标签:
【中文标题】重置搜索小部件 (SearchView) 值【英文标题】:Resetting Search Widget (SearchView) value 【发布时间】:2012-10-20 00:14:26 【问题描述】:我有 2 个活动:第一个,HomepageActiviy
,有一个搜索小部件,它使用另一个活动搜索数据,SearchActivity
。
我想要做的是,当我从 SearchActiviy
返回到 HomepageActivity
时,搜索小部件会折叠并显示一个空文本。
我已尝试执行以下操作:
public class HomepageActivity extends Activity
@TargetApi(11)
@Override
public boolean onCreateOptionsMenu(Menu menu)
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.projectslist, menu);
if(Build.VERSION.SDK_INT >= 11)
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
ComponentName component = new ComponentName(this, SearchActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
searchView.setIconifiedByDefault(true);
searchView.setQuery("", false);
return super.onCreateOptionsMenu(menu);
[…]
@TargetApi(11)
@Override
protected void onRestart()
super.onRestart();
if(Build.VERSION.SDK_INT >= 11)
invalidateOptionsMenu();
launchAsynchronousImageDownload();
如果小部件很好地显示为折叠状态,小部件中的文本仍会记住搜索过的文本(在我重新打开小部件后)。 如何重置小部件的文本?
感谢您的帮助! ;)
【问题讨论】:
【参考方案1】:您还可以尝试以下方法:
searchView.setQuery("", false);
searchView.clearFocus();
【讨论】:
里面有乱七八糟的 searchView.setIconified(true); @TarekEl-MallahsetIconified
将视图缩小为图标。仅尝试清除查询时,既不需要也不需要。【参考方案2】:
这就是魔法
searchView.setQuery("", false);
//清除文字
searchView.setIconified(true);
//关闭搜索编辑器,重新制作搜索图标
在HomepageActivity中,在oncreate函数之后插入onSaveInstanceState函数
每次打开新活动时都会触发此功能, 在打开新活动之前,它将重置 Search Widget 的值
protected void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
searchView.setQuery("", false);
searchView.setIconified(true);
【讨论】:
【参考方案3】:这对我有用:
首先,我在活动的顶部声明了菜单项变量:
private MenuItem mSearchMenuItem;
我在 OnCreateOptionsMenu() 中定义了变量:
mSearchMenuItem = menu.findItem(R.id.action_search);
我在 onResume() 中声明了 invalidateOptionsMenu():
@Override
protected void onResume()
invalidateOptionsMenu();
super.onResume();
最后,我在 onPrepareOptionsMenu() 的菜单项上调用了 collapseActionView()。
@Override
public boolean onPrepareOptionsMenu(Menu menu)
mSearchMenuItem.collapseActionView();
return super.onPrepareOptionsMenu(menu);
【讨论】:
在我看来它提供了最好的结果。将 searchView 设置为图标化并清除其焦点会将搜索图标带到左侧,而不是像从未单击过一样完全清除它。【参考方案4】:searchView.setQuery("", false);
searchView.setIconified(false);
【讨论】:
【参考方案5】:我也遇到了这个问题,如果我把它放在 onPrepareOptionsMenu 中就可以了。
@Override
public boolean onPrepareOptionsMenu (Menu menu)
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setQuery("", false);
// rest of code...
【讨论】:
【参考方案6】:科特林
这是一个更清洁的解决方案,它修复了以下问题:
-
屏幕旋转后显示过滤列表的问题。
当用户切换到其他应用并返回时显示过滤列表的问题。
当用户返回时搜索菜单向左移动的问题。
如果您要失效,则无需图标化,它会自动完成。
override fun onSaveInstanceState(outState: Bundle)
super.onSaveInstanceState(outState)
searchView.setQuery("", false)
(activity as YourActivity).invalidateOptionsMenu()
确保将 YourActivity
更改为您的 Fragment 所在的 Activity 名称。
【讨论】:
【参考方案7】:刚刚找到了一种丑陋的方法来使其工作(阅读 cmets 以查看差异):
public class HomepageActivity extends Activity
// Declaring SearchView as an instance object
private SearchView searchView;
@TargetApi(11)
@Override
public boolean onCreateOptionsMenu(Menu menu)
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.projectslist, menu);
if(Build.VERSION.SDK_INT >= 11)
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// Using instance var instead of local var
searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
ComponentName component = new ComponentName(this, SearchActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
searchView.setIconifiedByDefault(true);
// Setting query is not anymore required
//searchView.setQuery("", false);
return super.onCreateOptionsMenu(menu);
[…]
@TargetApi(11)
@Override
protected void onRestart()
super.onRestart();
// Do not need to recreate menu
/*if(Build.VERSION.SDK_INT >= 11)
invalidateOptionsMenu();*/
if(Build.VERSION.SDK_INT >= 11)
// Calling twice: first empty text field, second iconify the view
searchView.setIconified(true);
searchView.setIconified(true);
launchAsynchronousImageDownload();
我认为这很丑陋,所以如果有人有更好的主意,请告诉我:)
【讨论】:
你好@kyriog..虽然我回答得太晚了..但我遇到了同样的问题。在 onRestart() 方法中,我首先清空了文本字段,然后将视图图标化。它解决了我的问题,无需调用 setIconified() 两次。searchView.setQuery("",false);
searchView.setIconified(true);
以上是关于重置搜索小部件 (SearchView) 值的主要内容,如果未能解决你的问题,请参考以下文章
Android SearchRecentSuggestions - 在 SearchView 中输入时不显示建议