我实际上是在尝试使用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。
答案 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));
}
}