实际上,我正在尝试使用android的内置搜索界面,但是当我试图通过搜索查询传递数据时,我遇到了一些问题。
这里有一个简单的解释:我在第一个活动(first activity)中有一个名为“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;
}

在第二个活动中,我试着得到这个包:
@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]

我试图将一些其他对象添加到包中(booleans,等等…),但它一点也没有改变,我一直有一个空的appdata。

最佳答案

如果您使用的是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)。

07-28 07:40