toolbar 搜索功能

1.首先在menu文件中设置searchItem的属性

 
  
<item android:id="@+id/action_search"
      android:icon="@android:drawable/ic_menu_search"
      android:title="搜索"
      app:actionViewClass="android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView"/>
 
  

2.在search icon 所在的activity中加上下面的配置

< activity android :name= ".SearchActivity" android :label= "@string/app_name"> < intent-filter> < action android :name= "android.intent.action.MAIN"/> < category android :name= "android.intent.category.LAUNCHER"/> intent-filter>
    // 这个一定要加,之前按照官方文档一步一步操作,发现一只有问题,后来才知道缺少这个配置  
       如果不加 searchManager.getSearchableInfo(getComponentName());返回null
       导致出错
< meta-data  
android:name="android.app.default_searchable"        
android:value=".SearchResultsActivity"/>activity>

3.配置接受搜索关键字的activity 在这个activity中做一些对搜索结果的处理


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

4.searchable.xml 在res中创建 xml文件夹 并在xml文件夹中 创建 searchable.xml文件

  内容如下:
<searchable
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/app_name"
    android:label="@string/app_name"/>
hint:表示搜索框中的提示 注意: hint 和 label 这两个一定要写@string/.. 这种格式  如果直接写 “hello”这种会出问题。
为什么呢?下面代码部分会分析。

5.在searchActivity中添加代码

 
  
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.pay_menu,menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        CharSequence queryHint = searchView.getQueryHint();
        SearchableInfo searchableInfo = searchManager.getSearchableInfo(getComponentName());
        /**
         * searchableInfo 中label 和 hint 都是以id的形式保存的,所以在searchable.xml中一定要
         * 写 @string/... 的形式赋值, 直接写"hint" 这种字符串是无效的。
	SearchableInfo 中保存这两个字符串的id
	private final int mLabelId;
	private final int mHintId;
*/  
 searchView.setSearchableInfo(searchableInfo);       
 return true;    }
6.在SearchResultsActivity中添加如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_toolbar_search_result);
    handleIntent(getIntent());
}

// android:launchMode="singleTop"
这个activity启动模式设置为 singleTop,因此要重写 onNewIntent这个方法
@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);
	// query 就是在上一个activity中 搜索框中输入的搜索内容
    }
}
 
  
 
  
 
  


你可能感兴趣的:(toolbar 搜索功能)