Android SearchBar 搜索框介绍SearchManager
浮动搜索框的使用其实并不难,而是在于它的配置非常之繁琐,对于它的使用主要是方便开发者对于程序中有搜索业务时,更好的设计UI
SearchManager具体使用步骤如下:
(1)配置search bar的相关信息,新建一个位于res/xml下的一个searchable.xml的配置文件,如默认值、是否有搜索建议或者语音搜索。
- 01.<searchable xmlns:android=http://schemas.android.com/apk/res/android
- 02. <!-- label为搜索框上方的文本,hint搜索框里面的提示文本,显示label -->
- 03. android:label="@string/search_label"
- 04. android:hint="@string/search_hint"
- 05. android:searchMode="showSearchLabelAsBadge"
- 06.
- 07. <!-- 语音搜索配置 -->
- 08. android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
- 09. android:voiceLanguageModel="free_form"
- 10. android:voicePromptText="@string/search_invoke"
- 11.
- 12. <!-- 配置搜索建议,配置错误将不会显示,这里的searchSuggestAuthority的值必须是
- 13. 继承自SearchRecentSuggestionsProvider的完整路径名 -->
- 14. android:searchSuggestAuthority="com.android.cbin.SearchSuggestionSampleProvider"
- 15. android:searchSuggestSelection=" ? "
- 16./>
复制代码 (2) manifest.xml配置,搜索结果处理的Activity将出现两种情况,一种是从其他Activity中的search bar打开一个Activtiy
专门处理搜索结果,第二种是就在当前Activity就是处理结果的Activity,先介绍第一种配置:
- 01.<activity android:name="SearchResultActivity">
- 02.
- 03. <intent-filter>
- 04. <action android:name="android.intent.action.SEARCH"></action>
- 05. </intent-filter>
- 06.
- 07.
- 08. <!-- 指定上面的searchable.xml文件 -->
- 09. <meta-data android:resource="@xml/searchable"
- 10. android:name="android.app.searchable"></meta-data>
- 11.
- 12. </activity>
复制代码 <!-- 为了使每一个Activity都能使用search bar,一定要将这个标签放到启动Activity中,里面的value指定 的是前面的搜索结果Activity--> <meta-data android:name="android.app.default_searchable"
android:value=".SearchResultActivity" />(3)搜索建议在manifest.xml中相关的配置<!--之前searchable.xml中有一个searchSuggestAuthority的值其实和这里的
authorities指向的都是name中所关联的SearchSuggestionSampleProvider,他是一个
SearchRecentSuggestionsProvider的子类-->
<provider android:name="SearchSuggestionSampleProvider"
android:authorities="com.android.cbin.SearchSuggestionSampleProvider"></provider>
上面authorities指向的都是name中所关联的SearchSuggestionSampleProvider,他是一个
SearchRecentSuggestionsProvider的子类- 01.public class SearchSuggestionSampleProvider extends
- 02. SearchRecentSuggestionsProvider {
- 03.
- 04. final static String AUTHORITY="com.android.cbin.SearchSuggestionSampleProvider";
- 05. final static int MODE=DATABASE_MODE_QUERIES;
- 06.
- 07. public SearchSuggestionSampleProvider(){
- 08. super();
- 09. setupSuggestions(AUTHORITY, MODE);
- 10. }
- 11.}
复制代码 (4)为了能够使用search bar 我们必须重写Activity的onSearchRequested的方法,在界面上启动一个search bar
但是这个动作不会自动触发,必须通过一个按钮或者菜单的点击事件触发;
- 01.@Override
- 02. public boolean onSearchRequested(){
- 03.
- 04. String text=etdata.getText().toString();
- 05. Bundle bundle=new Bundle();
- 06. bundle.putString("data", text);
- 07.
- 08. //打开浮动搜索框(第一个参数默认添加到搜索框的值)
- 09. //bundle为传递的数据
- 10. startSearch("mm", false, bundle, false);
- 11. //这个地方一定要返回真 如果只是super.onSearchRequested方法不但
- 12. //onSearchRequested(搜索框默认值)无法添加到搜索框中,bundle也无法传递出去
- 13. return true;
- 14. }
- 复制代码(5)接收query和bundle、保存query值(即搜索建议的列表值)
- 01.public void doSearchQuery(){
- 02. final Intent intent = getIntent();
- 03. //获得搜索框里值
- 04. String query=intent.getStringExtra(SearchManager.QUERY);
- 05. tvquery.setText(query);
- 06. //保存搜索记录
- 07. SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
- 08. SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
- 09. suggestions.saveRecentQuery(query, null);
- 10. if(Intent.ACTION_SEARCH.equals(intent.getAction())){
- 11. //获取传递的数据
- 12. Bundle bundled=intent.getBundleExtra(SearchManager.APP_DATA);
- 13. if(bundled!=null){
- 14. String ttdata=bundled.getString("data");
- 15. tvdata.setText(ttdata);
- 16.
- 17. }else{
- 18. tvdata.setText("no data");
- 19. }
- 20. }
- 21. }
复制代码 之前说到了处理结果的Activity将可能出现的两种情况的两种,现在就处理第二种状况,就是假如invoke search bar的Activity同时也是处理搜索结果的Activity,如果按照之前的方式处理则会出现一种情况,搜索一次就实例化一次Activity,当按返回键的时候会发现老是同一个Activity,其实为了使它只有一个实例化对象,只需简单的配置和代码就能实现第一:在处理搜索结果Activity的manifest.xml中添加android:launchMode="singleTop"属性第二:重写Activity的onNewIntent(Intent intent)- 01.@Override
- 02. public void onNewIntent(Intent intent){
- 03. super.onNewIntent(intent);
- 04. //获得搜索框里值
- 05. String query=intent.getStringExtra(SearchManager.QUERY);
- 06. tvquery.setText(query);
- 07. //保存搜索记录
- 08. SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
- 09. SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
- 10. suggestions.saveRecentQuery(query, null);
- 11. if(Intent.ACTION_SEARCH.equals(intent.getAction())){
- 12. //获取传递的数据
- 13. Bundle bundled=intent.getBundleExtra(SearchManager.APP_DATA);
- 14. if(bundled!=null){
- 15. String ttdata=bundled.getString("data");
- 16. tvdata.setText(ttdata);
- 17.
- 18. }else{
- 19. tvdata.setText("no data");
- 20. }
- 21. }
- 22. }
复制代码 相关知识:上面讲到了将最近的搜索值添加到搜索建议中,但却没有提到如果清理搜索建议中的值,与保存相似,SearchRecentSuggestion对象提供了一个clearHistory()方法- 01.private void clearSearchHistory() {
- 02. SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
- 03. SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
- 04. suggestions.clearHistory();
- 05. }
-
复制代码 |