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中 搜索框中输入的搜索内容
}
}