Android SearchBar 搜索框介绍SearchManager

浮动搜索框的使用其实并不难,而是在于它的配置非常之繁琐,对于它的使用主要是方便开发者对于程序中有搜索业务时,更好的设计UI
SearchManager具体使用步骤如下:
(1)配置search bar的相关信息,新建一个位于res/xml下的一个searchable.xml的配置文件,如默认值、是否有搜索建议或者语音搜索。
  1. <searchable xmlns:android=http://schemas.android.com/apk/res/android
  2.   <!-- label为搜索框上方的文本,hint搜索框里面的提示文本,显示label -->
  3.     android:label="@string/search_label"
  4.     android:hint="@string/search_hint" 
  5.     android:searchMode="showSearchLabelAsBadge"
  6.     
  7.   <!-- 语音搜索配置 -->
  8.     android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
  9.     android:voiceLanguageModel="free_form"
  10.     android:voicePromptText="@string/search_invoke"

  11.     <!-- 配置搜索建议,配置错误将不会显示,这里的searchSuggestAuthority的值必须是
  12.     继承自SearchRecentSuggestionsProvider的完整路径名 -->
  13.    android:searchSuggestAuthority="com.android.cbin.SearchSuggestionSampleProvider"
  14.     android:searchSuggestSelection=" ? "
  15. />
复制代码
(2) manifest.xml配置,搜索结果处理的Activity将出现两种情况,一种是从其他Activity中的search bar打开一个Activtiy
专门处理搜索结果,第二种是就在当前Activity就是处理结果的Activity,先介绍第一种配置:
  1. <activity android:name="SearchResultActivity">
  2.     
  3.         <intent-filter>
  4.             <action android:name="android.intent.action.SEARCH"></action>
  5.         </intent-filter>

  6.      
  7.      <!-- 指定上面的searchable.xml文件 -->
  8.    <meta-data android:resource="@xml/searchable"
  9.          android:name="android.app.searchable"></meta-data>

  10.     </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的子类
  1. public class SearchSuggestionSampleProvider extends
  2.         SearchRecentSuggestionsProvider {

  3.     final static String AUTHORITY="com.android.cbin.SearchSuggestionSampleProvider";
  4.     final static int MODE=DATABASE_MODE_QUERIES;
  5.     
  6.     public SearchSuggestionSampleProvider(){
  7.         super();
  8.         setupSuggestions(AUTHORITY, MODE);
  9.     }
  10. }
复制代码
(4)为了能够使用search bar 我们必须重写Activity的onSearchRequested的方法,在界面上启动一个search bar
但是这个动作不会自动触发,必须通过一个按钮或者菜单的点击事件触发;

  1. @Override
  2.     public boolean onSearchRequested(){
  3.         
  4.         String text=etdata.getText().toString();
  5.         Bundle bundle=new Bundle();
  6.         bundle.putString("data", text);
  7.         
  8.         //打开浮动搜索框(第一个参数默认添加到搜索框的值)
  9.         //bundle为传递的数据
  10.         startSearch("mm", false, bundle, false);
  11.         //这个地方一定要返回真 如果只是super.onSearchRequested方法不但
  12.      //onSearchRequested(搜索框默认值)无法添加到搜索框中,bundle也无法传递出去
  13.         return true;
  14.     }
复制代码
(5)接收query和bundle、保存query值(即搜索建议的列表值)

  1. public void doSearchQuery(){
  2.         final Intent intent = getIntent();
  3.         //获得搜索框里值
  4.         String query=intent.getStringExtra(SearchManager.QUERY);
  5.         tvquery.setText(query);
  6.         //保存搜索记录
  7.         SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
  8.                 SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
  9.         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.             }else{
  17.                 tvdata.setText("no data");
  18.             }
  19.         }
  20.     }
复制代码
之前说到了处理结果的Activity将可能出现的两种情况的两种,现在就处理第二种状况,就是假如invoke search bar的Activity同时也是处理搜索结果的Activity,如果按照之前的方式处理则会出现一种情况,搜索一次就实例化一次Activity,当按返回键的时候会发现老是同一个Activity,其实为了使它只有一个实例化对象,只需简单的配置和代码就能实现第一:在处理搜索结果Activity的manifest.xml中添加android:launchMode="singleTop"属性第二:重写Activity的onNewIntent(Intent intent)
  1. @Override
  2.     public void onNewIntent(Intent intent){
  3.         super.onNewIntent(intent);
  4.         //获得搜索框里值
  5.         String query=intent.getStringExtra(SearchManager.QUERY);
  6.         tvquery.setText(query);
  7.         //保存搜索记录
  8.         SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
  9.                 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.             }else{
  18.                 tvdata.setText("no data");
  19.             }
  20.         }
  21.     }
复制代码
相关知识:上面讲到了将最近的搜索值添加到搜索建议中,但却没有提到如果清理搜索建议中的值,与保存相似,SearchRecentSuggestion对象提供了一个clearHistory()方法
  1. private void clearSearchHistory() {
  2.         SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, 
  3.                 SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
  4.         suggestions.clearHistory();
  5.     }
复制代码
忘了上效果图:oye

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,无法得知您所说的“搜索框”具体指的是哪一种。以下是两种可能的解答: 1. 在Android Studio中添加搜索框控件: 在XML布局文件中添加SearchView控件即可,如下所示: ```xml <SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 同时,还需要在Java代码中对SearchView进行初始化和设置监听器等操作,具体可参考以下代码: ```java SearchView searchView = findViewById(R.id.searchView); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 处理搜索提交事件 return false; } @Override public boolean onQueryTextChange(String newText) { // 处理搜索文本变化事件 return false; } }); ``` 2. 在Android Studio中添加搜索框功能: 如果您是想在Android应用中添加搜索功能,可以使用Android提供的Searchable Activity来实现。具体步骤如下: 1)在AndroidManifest.xml文件中添加Searchable配置: ```xml <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> ``` 其中,SearchableActivity是您自己定义的Activity类名,@xml/searchable是一个XML文件,用于配置搜索框的属性。 2)在res/xml目录下创建searchable.xml文件,配置搜索框的属性,如下所示: ```xml <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" /> ``` 其中,label属性指定搜索框的标题,hint属性指定搜索框的提示文本,voiceSearchMode属性指定是否显示语音搜索按钮。 3)在SearchableActivity中处理搜索事件,如下所示: ```java public class SearchableActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_searchable); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); // 处理搜索事件 } } } ``` 其中,handleIntent()方法用于处理搜索事件,可以在其中获取搜索关键字等信息,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值