我对开发人员指南中看似矛盾的内容有点困惑。在"决定你是否需要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
的可搜索活动。