toolbar 搜索功能

来源:互联网 发布:知乎lol dota 编辑:程序博客网 时间:2024/05/16 05:16

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> <!-- 指定搜索接收搜索内容的activity -->
    // 这个一定要加,之前按照官方文档一步一步操作,发现一只有问题,后来才知道缺少这个配置  
       如果不加 searchManager.getSearchableInfo(getComponentName());返回null
       导致出错
<meta-data  
android:name="android.app.default_searchable"        
android:value=".SearchResultsActivity"/></activity>

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

<!-- searchview result --><activity    android:name=".SearchResultsActivity"    android:launchMode="singleTop">    <intent-filter>        <action android:name="android.intent.action.SEARCH"/>    </intent-filter>    <!-- 一定要写在这个activity里 -->    <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中添加如下代码:
@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_toolbar_search_result);    handleIntent(getIntent());}
// android:launchMode="singleTop"
这个activity启动模式设置为 singleTop,因此要重写 onNewIntent这个方法@Overrideprotected 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中 搜索框中输入的搜索内容    }}



0 0
原创粉丝点击