Overview
###Search Dialog or Search Widget
-
Search Dialog是一个android系统能够控制的组件,只能放置在Activity的顶部。
-
Search Widget是SearchView的一个实例,可放置在Activity的任意位置。仅在Android 3.0以后才可使用。
当用户执行一个搜索时,系统将查询提交给开发者指定的查询执行的Activity,并可以提供提示。
用户使用search dialog或the search widget来搜索时,系统会创建一个Intent,Intent中包含用户的查询,启动执行搜索的Activity,传递这个Intent。
在选择使用search dialog还是search widget的时候,需要考虑的是应用支持的sdk版本,Search Widget只能在Android 3.0以后才可使用(因为SearchView在Android 3.0被引入)。所以,如果开发的应用需要支持Android 3.0以下的版本,只能选择Search Dialog。如果支持3.0以后的版本,选择哪个都可以,通常推荐使用Search Widget放置在Action Bar上(如果Action Bar上有足够的空间或是应用使用Action Bar的前提下)。
###创建搜索配置
在res/xml/目录下创建一个searchable.xml文件。系统使用这个文件来创建一个SearchableInfo对象,但开发者并不能在运行时手动创建此对象。
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint">
</searchable>
必须包含android:label,指向应用的名字。推荐包含android:hint属性,提供搜索的提示。
###创建搜索Activity
搜索Activity用于接收查询和展示搜索结果。在本文中,搜索Activity是MyActivity。
声明这个搜索Activity接收带有ACITON_SEARCH的Intent,并指明使用的搜索配置,即上一步中创建的xml文件。
1
2
3
4
5
6
7
8
9
<application>
<activity android:name=".MyActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
</application>
###执行搜索
执行搜索分为三个步骤:(在MyActiivty中)
- 接收查询
1
2
3
4
5
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doSearch(query);
}
- 执行搜索
搜索分为两类,一个是查询SQLite中的数据,一个是查询服务器端的数据。
- 展示结果
展示结果一般使用ListView。
在触发搜索的Activity,在其AndroidManifest.xml中必须声明执行搜索的Activity
1
2
3
4
<activity android:name=".OtherActivity">
<meta-data android:name="android.app.default_searchable"
android:value=".MyActivity" />
</activity>
###触发Search Dialog
在OtherActivity中,放置一个搜索按钮,在按钮的点击事件中,触发Search Dialog。调用
1
onSearchRequested();
###结果
梳理一下整个流程,在OtherActivity中放置一个搜索按钮,点击按钮,触发搜索,系统将用户搜索词用Intent传递给MyActivity。在MyActivity中接收Intent,根据用户搜索词进行数据的查询,并将结果展示给用户。
点击按钮,出现search view,如图
###Search Widget
Search Widget提供的功能和Search Dialog相同。触发它,需要类似如下的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the options menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
return true;
}