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> <!-- 指定搜索接收搜索内容的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中添加如下代码:
@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中 搜索框中输入的搜索内容
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值