創(chuàng)建搜索界面
Android提供個(gè)兩個(gè)方法用于創(chuàng)建搜索界面:
- 搜索對話框:一個(gè)由Android System控制的UI組件,并由用戶配置激活顯示在Activity的頂部。Android系統(tǒng)控制對話框中的所有事件。

- 搜索組件:是SearchView的一個(gè)實(shí)例,它的行為類似EditText,可以放置在界面任何地方,需要對它進(jìn)行配置以讓Android系統(tǒng)進(jìn)行處理事件。Google建議將之放置ActionBar中。當(dāng)然,開發(fā)者也可以通過SearchView里的回調(diào)方法和監(jiān)聽器去處理用戶事件。

由此可見,使用SearchView會更加靈活。
相同之處,兩者都要對SearchableInfo進(jìn)行配置。
不同之處為,搜索對話框需要調(diào)用activity的onSearchRequested()激活顯示。而SearchView則需要默認(rèn)顯示,只須決定其初始的顯示狀態(tài)為展開或閉合。
配置
當(dāng)用戶在搜索框或用搜索組件執(zhí)行了一個(gè)搜索,系統(tǒng)創(chuàng)建了一個(gè)附帶了用戶查詢詞的Intent,并啟動activity去處理搜索。為了滿足以上要求,需要以下東西:
- 搜索配置:一個(gè)XML文件searchable.xml,可以配置語音搜索、搜索建議和提示詞。
- 在manifest.xml中配置一個(gè)用于執(zhí)行搜索并顯示結(jié)果的Activity
- 一個(gè)搜索入口:搜索對話框或搜索組件
創(chuàng)建searchable.xml
- 創(chuàng)建路徑:res/xml
- 對語音搜索,搜索建議和提示詞進(jìn)行配置
例子如下:
<?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>
創(chuàng)建一個(gè)Searchable Activity
Searchable Activity用于執(zhí)行搜索并顯示結(jié)果。當(dāng)用戶在搜索框或搜索組件上開始搜索時(shí),該Searchable Activity會收到一個(gè)附帶搜索詞而且類型為ACTION_SEARCH的Intent.為達(dá)到該目的,開發(fā)者需要在manifest.xml中對Searchable Activity進(jìn)行指定,如下,其中ActivityWithDialog就是用于搜索的Activity。
<activity
android:name=".searchsample.ActivityWithDialog"
android:label="@string/title_activity_activity_with_dialog"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<meta-data android:name="android.app.default_searchable"
android:value=".searchsample.MainSearchActivity"/>
</activity>
注意,搜索框或搜索組件所在的Activity,也可以用于執(zhí)行搜索和顯示搜索結(jié)果,即輸入搜索詞的Activity和基于搜索詞進(jìn)行搜索和顯示的Activity可以是同一個(gè)Activity。上面的例子就是這種情況。
但是,兩種方式的處理方法有所不同:
- 用一個(gè)Activity時(shí),需要重寫Activity的onNewIntent()方法,并在manifest.xml種設(shè)置activity的lauchMode為singleTop.
- 用兩個(gè)Activity時(shí),只須在被啟動的activity中的onCreate()方法中使用getIntent()獲得前一個(gè)activity的傳遞過來的附帶查詢詞的intent.
執(zhí)行搜索
- 接收帶搜索詞的Intent
- 搜索
1 本地搜索
2 云端搜索
search dialog對activity聲明周期的影響
搜索對話框彈出后,activity只是失去焦點(diǎn),onPause()并不會被調(diào)用。
注:本篇文章主要在閱讀完官方文檔后的一個(gè)小結(jié),后面會繼續(xù)探索Search方面的使用。