重置搜索小部件(SearchView)的值

39

我有两个活动:第一个是HomepageActivity,它有一个搜索小部件,可以使用另一个活动SearchActivity搜索数据。

我的目标是,当我从SearchActivity返回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();
    }
}
如果小部件已被折叠得很好,小部件中的文本仍会记住搜索的文本(在我重新打开小部件后)。 如何重置小部件的文本?
谢谢任何帮助! ;)
7个回答

79

您也可以尝试以下方式:

searchView.setQuery("", false);
searchView.clearFocus();

在这里有一些混乱的代码:searchView.setIconified(true); - Tarek El-Mallah
1
@TarekEl-Mallah setIconified方法将视图缩小为仅图标。当仅尝试清除查询时,它既不是必需的也不会丢失。 - Abandoned Cart

47

这是魔法

searchView.setQuery("", false); // 清除文本内容

searchView.setIconified(true); // 关闭搜索编辑器并重新显示搜索图标

在HomepageActivity中,在oncreate函数后插入onSaveInstanceState函数。

每次打开新的activity时,此函数都会被触发,它会在打开新的activity之前重置搜索小部件的值。

  protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
         searchView.setQuery("", false);
        searchView.setIconified(true);
    }

12

这对我有效:

首先,在活动顶部声明了菜单项变量:

private MenuItem mSearchMenuItem;

我在OnCreateOptionsMenu()中定义了这个变量:

mSearchMenuItem = menu.findItem(R.id.action_search);

我在onResume()方法中声明了invalidateOptionsMenu():

I declared invalidateOptionsMenu() in onResume():
@Override
protected void onResume() {
    invalidateOptionsMenu();
    super.onResume();
}

最后,在onPrepareOptionsMenu()中,我对菜单项调用了collapseActionView()。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    mSearchMenuItem.collapseActionView();

    return super.onPrepareOptionsMenu(menu);
}

1
在我看来,它提供了最佳的结果。将searchView设置为iconified并清除其焦点会将搜索图标移到左侧,而不是完全清除它,就好像从未单击过一样。 - Vinicius Victor

4
searchView.setQuery("", false);
searchView.setIconified(false);

2

我也遇到过这个问题,如果我将它放在onPrepareOptionsMenu中,它就可以正常工作。

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
     SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
     searchView.setQuery("", false);
     // rest of code...
}

1

Kotlin

这里提供了更简洁的解决方案,它修正了以下问题:

  1. 屏幕旋转后显示过滤列表的问题。
  2. 在用户切换到其他应用程序并返回后显示已筛选列表的问题。
  3. 当用户返回时搜索菜单向左移动的问题。

如果您正在使其失效,则无需缩小图标,它会自动完成。


override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    searchView.setQuery("", false)
    (activity as YourActivity).invalidateOptionsMenu()
}

请确保将YourActivity更改为您拥有Fragment的Activity名称。

0

刚刚找到了一个丑陋的方法让它工作(请阅读注释以查看差异):

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); - Dory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接