Android,多个可搜索的活动?
如何进行两种不同的可搜索活动 我在我的应用程序的不同部分有不同的搜索逻辑(搜索内容和显示结果的方式) 例如,在某些活动中,我希望查询联机数据库中的A类对象,在另一个活动中,我希望查询联机数据库中的B类对象 我目前有一个可搜索的活动设置,按照指南: ,非常适合搜索A类对象。但是,我不知道如何创建具有不同布局和查询逻辑的第二个可搜索活动。您似乎只能将可搜索元数据应用于一个活动Android,多个可搜索的活动?,android,android-activity,android-actionbar,searchview,Android,Android Activity,Android Actionbar,Searchview,如何进行两种不同的可搜索活动 我在我的应用程序的不同部分有不同的搜索逻辑(搜索内容和显示结果的方式) 例如,在某些活动中,我希望查询联机数据库中的A类对象,在另一个活动中,我希望查询联机数据库中的B类对象 我目前有一个可搜索的活动设置,按照指南: ,非常适合搜索A类对象。但是,我不知道如何创建具有不同布局和查询逻辑的第二个可搜索活动。您似乎只能将可搜索元数据应用于一个活动 一定有办法,对吧?是的,有办法 如果您希望应用程序中只有一个默认搜索活动,而其他多个活动向其发送搜索查询,则可以在特定活动中
一定有办法,对吧?是的,有办法 如果您希望应用程序中只有一个默认搜索活动,而其他多个活动向其发送搜索查询,则可以在特定活动中创建搜索视图时提供应用程序搜索元数据,如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
Bundle bundle = new Bundle();
bundle.putString("Search Type", "local search");
bundle.putString("Other metadata", "metadata");
searchView.setAppSearchData(bundle);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
}
mSearchQuery = intent.getStringExtra(SearchManager.QUERY);
Bundle bundle = intent.getBundleExtra(SearchManager.APP_DATA);
// Get the type of search to perform
mSearchType = bundle.getString("Search Type");
然后在默认搜索活动中获取应用程序搜索元数据,如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
Bundle bundle = new Bundle();
bundle.putString("Search Type", "local search");
bundle.putString("Other metadata", "metadata");
searchView.setAppSearchData(bundle);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
}
mSearchQuery = intent.getStringExtra(SearchManager.QUERY);
Bundle bundle = intent.getBundleExtra(SearchManager.APP_DATA);
// Get the type of search to perform
mSearchType = bundle.getString("Search Type");
在要从中搜索的每个活动中,覆盖选项菜单,如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the options menu
getMenuInflater().inflate(R.menu.activity_search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
if (searchManager != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
return true;
}
// Override onOptionsItemSelected and onSearchRequested() adds additional data to intent
// If you have several activities that use the SearchableActivity, override these methods to
// add contextual data. You can even modify the searchEvent by using the constructor -
// onSearchRequested(SearchEvent se))
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_search:
onSearchRequested();
return true;
default:
return false;
}
}
@Override
public boolean onSearchRequested() {
Bundle b = new Bundle();
b.putString(SearchableActivity.TAG, MainActivity.TAG);
startSearch(null, false, b, false);
return true;
}
这里记录了这一点:
以上就是一个有效的例子。当然,这假设您已经正确地设置了所有其他内容。希望这能有所帮助。setAppSearchData不是支持SearchView或framework的SearchView的公共方法。它使用@RestrictTo(LIBRARY_GROUP)注释,没有文档记录。是否有一种记录在案的方法来做类似的事情?