Android,多个可搜索活动?

时间:2015-07-23 06:30:23

标签: android android-activity android-actionbar searchview

如何进行两种不同的可搜索活动?

我的应用程序的不同部分(我正在搜索的内容以及我如何显示结果)中有不同的搜索逻辑。

例如,在某些活动中,我希望在我的在线数据库中查询A类对象,在另一个活动中,我希望在我的在线数据库中查询B类对象。

我目前按照指南进行了可搜索的活动设置: http://developer.android.com/guide/topics/search/search-dialog.html,并且非常适合搜索A类对象。但是,我无法弄清楚如何进行具有不同布局和查询逻辑的第二个可搜索活动。您似乎只能将可搜索的元数据应用于一个活动?

必须有办法做到这一点,对吧?

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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 以上是一个工作示例。当然,这假定您已正确设置了所有其他内容。希望这会有所帮助。