安卓系统,如何实现多个可搜索活动界面?

5
我怎样才能创建两个不同的可搜索活动?
我在应用程序的不同部分中具有不同的搜索逻辑(我正在搜索什么以及如何显示结果)。
例如,在某些活动中,我希望查询我的在线数据库以获取A类对象,并在另一个活动中查询我的在线数据库以获取B类对象。
我目前已经按照指南设置了可搜索活动:http://developer.android.com/guide/topics/search/search-dialog.html,并且非常适合搜索A类对象。但是,我无法弄清楚如何创建具有不同布局和查询逻辑的第二个可搜索活动。似乎只能将可搜索元数据应用于一个活动?
一定有办法做到这一点,对吧?
2个回答

0
在每个活动中,您想要搜索覆盖选项菜单的方式如下:
@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;
}

这里有文档:https://developer.android.com/guide/topics/search/search-dialog#SearchDialog 上述是一个可行的例子。当然,这假设您已经正确设置了其他所有内容。希望这可以帮到您。


0

是的,有一种方法可以做到。

如果您想在应用程序中只有一个默认搜索活动,并且其他多个活动将搜索查询发送到它,则可以在特定活动中创建搜索视图时提供应用程序搜索元数据,如下所示:

@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");

setAppSearchData不是支持SearchView或框架的SearchView的公共方法。它使用@RestrictTo(LIBRARY_GROUP)注释,并且没有文档记录。是否有一种记录方式来实现类似的功能? - Simon Warta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接