Liping Zou bio photo

Liping Zou

An Android Developer

Email Twitter Instagram Github Stackoverflow

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,如图

image

###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;
}