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