如果不将数据共享到其他应用,ContentProvider 对于 SearchView 是否冗余?



我对开发人员指南中看似矛盾的内容有点困惑。在"决定你是否需要ContentProvider"一节中,它首先声明如果"你想使用搜索框架提供自定义搜索建议",然后它说"如果使用完全在你自己的应用程序中,你不需要使用SQLite数据库的提供者"。如果我为SearchView提供的数据是在SQLite数据库中,而我不打算将此数据共享给除本应用程序之外的任何应用程序怎么办?

如果我为SearchView提供的数据是在SQLite数据库中,我不打算将这些数据共享给除本应用程序本身以外的任何其他应用程序怎么办?

那么你有一个选择:

  • 创建ContentProvider并使用搜索框架。如果您决定创建一个ContentProvider,您可以配置XML格式的搜索建议。

    下面是遗留SearchableDictionary示例应用程序中的一个示例:

    首先你需要一个"可搜索的活动"。在清单中这样声明:

    <application ... >
        <activity android:name=".SearchableActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                       android:resource="@xml/searchable"/>
        </activity>
        ...
    </application>
    

    注意元数据中指定的可搜索资源。它可能看起来像这样:

    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
            android:label="@string/search_label"
            android:hint="@string/search_hint"
            android:searchSettingsDescription="@string/settings_description"
            android:searchSuggestAuthority="com.example.android.searchabledict.DictionaryProvider"
            android:searchSuggestIntentAction="android.intent.action.VIEW"
            android:searchSuggestIntentData="content://com.example.android.searchabledict.DictionaryProvider/dictionary"
            android:searchSuggestSelection=" ?"
            android:searchSuggestThreshold="1"
            android:includeInGlobalSearch="true"
            >
     </searchable>
    

    SearchView设置如下:

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    

    这样做的其他好处是a)你可以有ContentProvider通知你当任何更新已经对特定的内容URI和b)如果你最终决定让你的数据与其他应用程序共享,你已经完成了大部分工作。

    更多信息请参见以下链接:

    可搜索配置| Android Developers

    创建搜索界面| Android开发者

  • 不要使用搜索框架。您不需要为搜索建议设置ContentProvider,但是您仍然需要使用代码进行一些设置以使搜索和建议工作。您需要用setSuggestionsAdapter()SearchView提供CursorAdapter,并且您需要设置OnQueryTextListener来触发CursorAdapter上的过滤。

    另外,当在SearchView中按Enter键或从建议列表中选择建议时,您必须编写代码以启动startActivity的可搜索活动。

没有正确或错误的方法,只有不同的方法。你必须考虑这两种策略,并决定哪一种最适合你的应用的设计目标。

相关内容

  • 没有找到相关文章

最新更新