Search filter

摘自 Google Material Design 文档

此应用栏可以作为一个文本输入域,根据不同的用户类型,在下面展示被过滤和排序的内容。

如何添加?

I. 在 build.gradle 里引入最新的 appcompat 库。

dependencies {  
    compile 'com.android.support:appcompat-v7:X.X.X' // where X.X.X version
}

II. 创建一个有搜索标签的 searchable.xml ,并保存在 res/xml 目录。

<?xml version="1.0" encoding="utf-8"?>  
<searchable xmlns:android="http://schemas.android.com/apk/res/android"  
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>  

III. 在 AndroidManifest.xml 里声明 searchable activity 。

<activity android:name=".SearchActivity">  
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android:resource="@xml/searchable" />
</activity>  

IV. 在任意的 layout.xml 声明 SearchView

<android.support.v7.widget.SearchView  
    android:id="@+id/search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

V. 在你的 Activity 的 onCreate 方法里设置你的 SearchView

SearchView searchView = (SearchView) findViewById(R.id.search);  
// 将在 searchable.xml 定义的搜索设置赋给 SearchView
SearchManager searchManager =  
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));  

VI. 执行搜索查询。

// 如果用户启动一个 searchable activity ,并传入一个 ACTION_SEARCH intent 动作来执行搜索(可以在 SearcheActivity 里这样做)

Intent intent = getIntent();  
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {  
  String query = intent.getStringExtra(SearchManager.QUERY);
  doMySearch(query);
}

监听用户输入

接收查询文本作为用户类型可以让你更快地过滤搜索结果。

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {  
    @Override
    public boolean onQueryTextSubmit(String query) {
        searchFor(query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String query) {
        filterSearchFor(query);
        return true;
    }
});

如何设置样式

I. 在 styles.xml 里声明自定义样式。

<style name="SearchViewTheme" >  
    <item name="colorControlActivated">@color/amber500</item>
    <item name="colorControlNormal">@color/green500</item>
</style>  

II. 通过 android:theme 属性将上面声明的样式应用到 SearchView 里。使用 app:searchIcon 属性改变搜索图标。

<android.support.v7.widget.SearchView  
    android:id="@+id/search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:searchIcon="@drawable/ic_library"
    app:theme="@style/SearchViewTheme"/>

Searchable activity 的生命周期

  1. 如果 SearchView 不在 searchable activity 里:在正常的 Activity 里,一旦执行搜索,生命周期事件就会被触发。结果,当前 Activity 会被 paused ,并且你的 searchable activity 会被 created
  2. 如果 SearchView 在 searchable activity 里,可能会出现以下两种情况:
    1. 默认:searchable activity 接收到 ACTION_SEARCH 意图会调用 onCreate 方法,这样就会创建两个 searchable activity 实例(一个在另一个栈顶)。
    2. 如果设置 android:launchModesingleTop:searchable activity 接收到 ACTION_SEARCH 意图后会调用 onNewIntent 方法。

想要了解更多,可以查看 Google Search Overview 文档。

翻译水平有限,欢迎批评指正

原文作者:Luis G. Valle 原文链接:search-filter

译者:Ailurus

Ailurus

Android Developer.