13

我已成功使用操作栏中的搜索小部件按照本指南执行搜索。搜索很好,但我想知道如何在搜索中传递其他变量。相同的指南指出我可以覆盖onSearchRequested(),但这似乎不适用于搜索小部件。

  • 有问题的覆盖:

    @Override
    public boolean onSearchRequested() {    
        Bundle appData = new Bundle();
        appData.putString("KEY", "VALUE");
        startSearch(null, false, appData, false);
        return true;
    }
    
  • 在我的活动课程中获取捆绑包:

    protected void onCreate(Bundle savedInstanceState) {
        // ...
        Intent intent = getIntent();
        Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
        String value = appData.getString("KEY");
        Log.d("VALUE", value);
        // ...
    }
    

我的应用程序在创建搜索类时崩溃,因为appData总是null.

笔记

onSearchRequested() 调用,但捆绑包没有进入我的onCreate()方法。

传递的意图的所有额外内容都是{user_query=my-query, query=my-query}.

4

3 回答 3

25

似乎这样做的唯一方法是拦截在启用搜索的活动中创建的新活动。为此,我们重写了该startActivity()方法。然后我们可以检查以确保该活动确实是搜索活动,然后在意图中添加额外内容。工作代码如下。

@Override
public void startActivity(Intent intent) {      
    // check if search intent
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        intent.putExtra("KEY", "VALUE");
    }

    super.startActivity(intent);
}

然后,您可以像在搜索活动中使用任何其他额外内容一样获取额外内容:

mValue = intent.getStringExtra("KEY");
于 2013-02-03T20:06:55.493 回答
1

您可以覆盖调用搜索的onSearchRequested方法。Activity

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

然后你可以在里面提取这个数据SearchableActivity

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}
于 2016-02-08T15:05:15.327 回答
0

我想你只想使用

String value = intent.getStringExtra(SearchManager.APP_DATA);

因为意图包含您传递的包以开始搜索。

于 2013-01-30T05:33:34.300 回答