我们建议使用
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><ph type="x-smartling-placeholder">
如果您想使用更方便易用的搜索图标,请创建
/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 }
运行应用会生成以下内容:
![一张图片,显示空白屏幕,应用顶部栏中有一个搜索图标](https://developer.android.google.cn/static/images/ui/searchview_1.png?authuser=0000&hl=nb)
SearchView
显示在应用的应用栏中,但未显示
功能。如果您点按搜索图标,会显示如下内容:
![展示实际搜索视图的图片](https://developer.android.google.cn/static/images/ui/searchview_2.png?authuser=0000&hl=nb)
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()
方法。
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
,您可以将其用于
架构来检索要显示的搜索结果。