重置搜索小部件 (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-Mallah setIconified 将视图缩小为图标。仅尝试清除查询时,既不需要也不需要。【参考方案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 中输入时不显示建议

向上滚动时,Textview 重置为旧值

SearchView 展开抛出空指针异常

如何重置QGridLayout中窗口小部件的列跨度?

是否有一个带有“重置”按钮的闪亮 textInput 小部件?

重置Tkinter窗口,还原小部件