2

我实际上是在尝试使用 Android 的内置搜索界面,但是当我尝试使用搜索查询传递数据时遇到了一些问题。

这是一个简短的解释:我在第一个活动(FirstActivity)中有一个名为“Category”的对象,它实现了可序列化(我已经在活动之间成功传递了它),我想执行与该类别相关的搜索,并将结果显示在第二个活动(SecondActivity)。

所以,在 FirstActivity 我覆盖了 onSearchRequest 方法:

@Override
public boolean onSearchRequested() {
    Bundle appData = new Bundle();
    appData.putSerializable("category", _currentCategory);
    Log.d(Utils.LOG_TAG, "Bundle : "+appData.keySet());
    startSearch(null, false, appData, false);
    return true;
}

在 SecondActivity 中,我尝试获取此 Bundle :

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    handleIntent(getIntent());
}

private void handleIntent(Intent intent){
    Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
    if(appData == null) Log.d(Utils.LOG_TAG, "appData == null");
    Log.d(Utils.LOG_TAG, "Extras : "+intent.getExtras().keySet());
}

问题是 appData 似乎每次都等于 null 。这是 logcat 输出:

Bundle : [category]
appData == null
Extras : [query, user_query]

我试图将一些其他对象添加到 Bundle(布尔值等)中,但它根本没有改变任何东西,而且我一直有一个空的 appData。

4

4 回答 4

3

我也很难弄清楚这一点,我发现的例子并没有真正帮助。他们中的许多人建议重写 onSearchRequested(),但这实际上不适用于 SearchWidget。我最终使用以下(来自 danada)作为解决方案,因为它对我来说似乎比设置 OnQueryTextListener 简单得多。我只是像这样覆盖 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);
}

然后在第二个可搜索的活动中,我提取了这样的信息(从 onCreate() 或覆盖 onNewIntent() 调用(如果使用 singleTop)):

private void handleIntent(Intent intent){
    if(Intent.ACTION_SEARCH.equals(intent.getAction())){
    mSearchedQuery = intent.getStringExtra(SearchManager.QUERY);
    mExtraData = intent.getStringExtra("KEY");
}

简单,而且像魅力一样工作!如果您想对此进行更多解释,请查看上面文章的链接。

于 2013-09-14T19:10:23.520 回答
1

如果您使用的是SearchView,它不会发送您的appData. 相反,请考虑使用OnQueryTextListener。例如:

...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your-menu-id, menu);

    /*
     * Get the SearchView and set the searchable configuration.
     */
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.your-search-menuitem-id)
            .getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    /*
     * Set query text listener here.
     */
    searchView.setOnQueryTextListener(mSearchViewOnQueryTextListener);

    return true;
}// onCreateOptionsMenu()

...
private final SearchView.OnQueryTextListener mSearchViewOnQueryTextListener = new SearchView.OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String query) {
        /*
         * You don't need to deal with "appData", because you already
         * have the search query here.
         */

        // Tell the SearchView that we handled the query.
        return true;
    }// onQueryTextSubmit()

    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }// onQueryTextChange()
};// mSearchViewOnQueryTextListener

注意:您仍然需要保留旧方式(使用appDatainsideonSearchRequested())。在您的onCreate()中,如果额外的 forSearchManager.APP_DATAisnull,这意味着您已经在侦听器中处理了搜索查询。

结论:

  • 如果SearchView是不活动的,并且您通过 调用它onSearchRequested(),则会发生这种情况:onSearchRequested()>> onCreate()ACTION_SEARCH 包含 SearchManager.APP_DATA)。
  • 如果SearchView是活动的,用户键入并提交搜索,这将发生:SearchView.OnQueryTextListener.onQueryTextSubmit()>> onCreate()ACTION_SEARCH 没有 SearchManager.APP_DATA)。
于 2012-11-29T02:15:06.797 回答
0

在放置数据和检索数据时,您使用的是两个不同的键。在放置您正在使用"category"的同时检索您正在使用SearchManager.APP_DATA而不是使用"category"

尝试

Bundle appData = intent.getBundleExtra("category");

谢谢迪帕克

于 2011-06-16T13:26:34.707 回答
0

在您的示例中,您要的是原始意图对象上的键集,而不是包含您的 appData 的 Bundle。这是一个应该有效的示例:

private void handleIntent(Intent intent){
    final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);

    for (String key : appData.keySet()) {
        Log.d(TAG, "key="+appData.getString(key));
    }
}
于 2012-02-04T00:48:30.690 回答