实际上,我正在尝试使用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
)。