32

我有 2 个活动:第一个HomepageActiviy,有一个搜索小部件,它使用另一个活动搜索数据,SearchActivity.

我想要做的是当我从SearchActiviyto返回时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();
    }
}

如果小部件很好地显示为折叠状态,小部件中的文本仍会记住搜索过的文本(在我重新打开小部件后)。如何重置小部件的文本?

谢谢你的帮助!;)

4

7 回答 7

73

您还可以尝试以下方法:

searchView.setQuery("", false);
searchView.clearFocus();
于 2013-05-30T20:33:34.283 回答
41

这就是魔法

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);
    }
于 2014-06-05T10:57:35.513 回答
11

这对我有用:

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

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);
}
于 2015-04-17T01:44:51.840 回答
4
searchView.setQuery("", false);
searchView.setIconified(false);
于 2013-08-21T20:15:48.087 回答
2

我也有这个问题,如果我把它放在 onPrepareOptionsMenu 中它就可以了。

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
     SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
     searchView.setQuery("", false);
     // rest of code...
}
于 2014-04-15T18:57:22.120 回答
1

科特林

这是一个更清洁的解决方案,它修复了以下问题:

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

如果您无效,则无需图标化,它会自动完成。


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

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

于 2019-10-19T11:29:31.950 回答
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();
    }
}

我认为这很丑陋,所以如果有人有更好的主意,请告诉我:)

于 2012-10-30T17:37:52.027 回答