使用onSearchRequested传递Bundle的问题

时间:2011-06-16 13:21:07

标签: android bundle android-searchmanager

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

这是一个简短的解释:我在第一个名为“Category”的Activity(FirstActivity)中有一个对象,它实现了Serializable(我已经在活动之间成功传递了它),我想执行与该类别相关的搜索,并显示结果是第二个Activity(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(Booleans等等)中,但它根本不会改变任何东西,而且我一直有一个null appData。

4 个答案:

答案 0 :(得分:3)

我也有问题解决这个问题,我发现的例子并没有真正帮助。很多人建议覆盖onSearchRequested(),但实际上这对SearchWidget不起作用。我最终以using the following(来自danada)作为解决方案,因为对我来说这比设置OnQueryTextListener要简单得多。我只是覆盖了startActivity(在第一个,搜索Activity),如下所示:

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

    super.startActivity(intent);
}

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

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

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

答案 1 :(得分: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

注意: 您仍然需要采用旧方法(在appData内使用onSearchRequested())。在onCreate()中,如果SearchManager.APP_DATA的额外内容为null,则表示您已在侦听器中处理了搜索查询。

结论:

  • 如果SearchView处于非活动状态,并且您通过onSearchRequested()调用它,则会发生这种情况:onSearchRequested()>> onCreate()ACTION_SEARCH 包含 SearchManager.APP_DATA)。
  • 如果SearchView处于有效状态,则用户会输入并提交搜索,这将会发生:SearchView.OnQueryTextListener.onQueryTextSubmit()>> onCreate()ACTION_SEARCH 没有 SearchManager.APP_DATA)。

答案 2 :(得分:0)

在放入数据并检索数据时,您使用的是两个不同的键。让你使用"category"并在检索时使用SearchManager.APP_DATA代替使用"category"

尝试

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

由于 迪帕克

答案 3 :(得分:0)

在您的示例中,您要求原始intent对象上的键集,而不是包含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));
    }
}