【问题标题】:Android, Multiple Searchable Activities?Android,多个可搜索的活动?
【发布时间】:2015-10-13 07:22:34
【问题描述】:

如何制作两个不同的可搜索活动?

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

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

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

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

【问题讨论】:

    标签: android android-activity android-actionbar searchview


    【解决方案1】:

    是的,有办法做到这一点。

    如果您希望在您的应用中只有一个默认搜索活动,而其他多个活动向其发送搜索查询,您可以在您的特定活动中创建搜索视图时提供应用搜索元数据,如下所示:

    @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) 注释并且没有记录。是否有记录在案的方法来做类似的事情?
    【解决方案2】:

    在您要搜索的每个活动中,覆盖选项菜单,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多