设置搜索界面

我们建议使用 SearchView widget 作为应用栏中的一项,在应用中提供搜索功能。如 应用栏中的所有项,您可以定义 SearchView, 始终展示,或仅在有空间时展示。您还可以将它定义为 可收起的操作,将 SearchView 显示为图标 一开始,当用户将整个应用栏显示为搜索字段时 并点按该图标

将 SearchView 添加到应用栏

如需将 SearchView widget 添加到应用栏,请在以下位置创建一个文件: 项目名称为 res/menu/options_menu.xml,并添加以下代码 文件。此代码定义了如何创建搜索项,例如图标 以及商品的标题。collapseActionView 属性 允许 SearchView 展开即可占据整个应用栏,并且 在不使用时,收起为一个普通的应用栏项。由于 手机设备上的应用栏空间有限,我们建议使用 collapsibleActionView 属性,以提供更好的用户 体验

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

如果您想使用更方便易用的搜索图标,请创建 /res/drawable 文件夹中的 ic_search.xml 文件,以及 请在代码中添加以下代码:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

如需在应用栏中显示 SearchView,请膨胀 XML 菜单 资源res/menu/options_menu.xml onCreateOptionsMenu() 方法:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

运行应用会生成以下内容:

一张图片,显示空白屏幕,应用顶部栏中有一个搜索图标
图 1. 应用顶部栏中的搜索图标。

SearchView 显示在应用的应用栏中,但未显示 功能。如果您点按搜索图标,会显示如下内容:

展示实际搜索视图的图片
图 2. SearchView的实际应用。

如需让 SearchView 正常运行,您必须定义 SearchView 的行为方式。

创建搜索配置

搜索 configuration 指定 SearchView 的行为方式和 在 res/xml/searchable.xml 文件中定义。搜索配置 必须至少包含一个 android:label 属性,且该属性 与 android:label 属性 应用程序><activity> 元素。不过,我们还建议您 android:hint 属性,让用户大致知道要输入什么内容 。

<?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" />

在应用的清单文件中,声明 <meta-data> 指向 res/xml/searchable.xml 文件的元素。声明 <activity> 中的一个元素,该元素将用于 SearchView

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

在您创建的 onCreateOptionsMenu() 方法中,将 将搜索配置与 SearchView 搭配使用,具体方法是调用 setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

getSearchableInfo() 获得 SearchableInfo (通过搜索配置 XML 文件创建)对象。当搜索 配置与您的 SearchView 正确关联,而 当用户提交查询时,SearchView 会使用 ACTION_SEARCH intent。然后,您需要一个可以过滤此 intent 并处理 搜索查询。

创建可搜索 activity

一个可搜索的 activity 过滤器,用于 ACTION_SEARCH intent 和 在数据集内搜索查询。如需创建可搜索的 activity,请将 您选择的一项活动来过滤ACTION_SEARCH intent:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

在您的可搜索 activity 中,通过以下方式处理 ACTION_SEARCH intent: 在您的 onCreate() 方法。

<ph type="x-smartling-placeholder">

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

现在,SearchView 可以接受用户的查询并启动您的 具有 ACTION_SEARCH intent 的可搜索 activity。

获取搜索查询后,您可以将其传递给 ViewModel,您可以将其用于 架构来检索要显示的搜索结果。