Android searchView setQuery不工作

Android searchView setQuery不工作,android,Android,我正在使用andriod中的搜索界面,并按照android指南设置了该界面 我创建了一个SearchableActivity,它将处理用户输入和搜索结果 现在我遇到了一个问题,当用户在SearchView中输入一些内容并点击搜索键时,搜索请求将被提交,然后我将接收查询字符串并进行搜索,但此时,SearchView中的文本已更改为默认的SearchHit值,而我希望它是查询字符串 因此我尝试使用searchView.setQuery(query,false),但它不工作,有什么问题吗 核心活动代码

我正在使用andriod中的搜索界面,并按照android指南设置了该界面

我创建了一个SearchableActivity,它将处理用户输入和搜索结果

现在我遇到了一个问题,当用户在
SearchView
中输入一些内容并点击搜索键时,搜索请求将被提交,然后我将接收查询字符串并进行搜索,但此时,
SearchView
中的文本已更改为默认的
SearchHit
值,而我希望它是查询字符串

因此我尝试使用
searchView.setQuery(query,false),但它不工作,有什么问题吗

核心活动代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_activity_layout);

    Log.d("map", "create");
    handleIntent(getIntent());
}

public void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    Log.d("map", "handleIntent");
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        //try search
        Log.d("map", "search and set query:" + query);
        searchView.setQuery(query, false); // reset the value in of the SearchView
    }
}
AndroidManifest.xml文件:

    <activity
        android:name=".ui.MapActivity"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

似乎当接收到带有Action
intent.Action\u SEARCH
的intent时,将调用以下方法:

handleIntent();

onCreateOptionsMenu();
handlecontent
将在
oncreateoptions菜单
之前运行

同时,人们习惯于在
oncreateoptions菜单上设置
searchView

这意味着选项菜单将重新充气,并且将重新构建
搜索视图
,然后
手册内容
中的所有设置将不起作用

我想这就是原因


如果我错了,请随时纠正我。

我建议您将设置延迟到下一个事件循环(将其添加到消息队列),因此代码可能如下所示:

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        final String query = intent.getStringExtra(SearchManager.QUERY);
        searchView.post(new Runnable() {

            @Override
            public void run() {
                // Important! Make sure searchView has been initialized
                // and referenced to the correct (current) SearchView.
                // Config changes (e.g. screen rotation) may make the
                // variable value null.
                searchView.setQuery(query, false);
            }
        };
    }
}
这不管用

    mSearchView.setQuery(mKeyword, true);
    MenuItemCompat.expandActionView(mMenuSearch);
确实如此

    MenuItemCompat.expandActionView(mMenuSearch);
    mSearchView.setQuery(mKeyword, true);
似乎只有在您扩展了“动作”视图后,它才会记住它。
我使用MenuItemCompat只是为了向后兼容

需要将代码放入带有MenuItemCompat的后期处理程序中

inflater.inflate(R.menu.menu_my_team, menu);
    // search manager integration for search widget
    SearchManager searchManager = (SearchManager) getActivity()
            .getSystemService(Context.SEARCH_SERVICE);
    final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    //    MenuItem helpTutorialMenuItem = menu.findItem(R.id.action_help);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    mSearchView.setSearchableInfo(searchManager
            .getSearchableInfo(getActivity().getComponentName()));

    mSearchView.setQueryHint("Search by");

    if (!TextUtils.isEmpty(queryText)) {
        mSearchView.post(new Runnable() {
            @Override
            public void run() {
                MenuItemCompat.expandActionView(searchMenuItem);
                mSearchView.setQuery(queryText, false);
            }
        });
    }
    mSearchView.clearFocus();

在我的例子中,它不起作用,因为我所在的碎片不再附着在窗口上。将它移到上面我在新搜索结果片段中交换的位置,修复了它。

你解决了问题吗。甚至我也在同一点上敲了一下。mSearchView.onActionViewExpanded();mSearchView.setQuery(“,true);为meShould工作时,应拉取
菜单项compat.expandActionView(searchMenuItem)未运行并在发布前添加。这一直对我有效,但我注意到它不是在我正在测试的牛轧糖设备上。工作完美它看起来有潜力,但我仍然无法将它设置为
菜单中初始化的
搜索视图
@jorgamvf在膨胀后,是否将
搜索视图
字段设置为创建的菜单?可能在
oncreateoptions菜单中
。基本上,这就是我正在使用的@fikr4n,现在我将您的作品添加到
handlecontent()
中,它被触发
onNewIntent
。由于
SearchView
是在
OnCreateOptions菜单()中初始化的,
SearchView
可以在声明的帮助下在外部捕获,但是当触发文本更改时,应用程序失败。在我的例子中,我可以在写入时为适配器设置一个过滤器,并且可以初始化
TextView
并将转录的语音搜索传递给它,但无法从语音更新查询。