四、創建Searchable Activity
searchable activity根據搜索關鍵字進行搜索,並顯示搜索結果。
當我們在search dialog or widget執行搜索的時候,系統就啟動你的searchable activity ,並把搜索關鍵字用一個aciton為ACTION_SEARCH的Intent傳給你的searchable activity. 你的searchable activity在Intent中通過extra的QUERY來提取搜索關鍵字,執行搜索並顯示搜索結果.
我們需要在AndroidManifest.xml文件中聲明Searchable Activity,以便在search dialog or widget執行搜索的時候,系統啟動該searchable activity並把搜索關鍵字傳給它。
4.1、聲明searchable activity
如何在AndroidManifest.xml文件中聲明Searchable Activity
1.
在activity的<intent-filter> 中添加一個可以接受action為ACTION_SEARCH的intent。
2.
在<meta-data>中指明search dialog or widget的配置文件(即searchable.xml)
比如,
示例2:
<application ... >
<activity android:name=".SearchableActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
...
</application>
<meta-data>必須包括android:name這個屬性,而且其值必須為"android.app.searchable",
還必須包括android:resource這個屬性,它指定了我們的search dialog的配置文件。(示例2中指定是the res/xml/searchable.xml).
注意: <intent-filter> 沒有必要加入<category android:name="android.intent.category.DEFAULT" /> ,
因為系統是通過component name把ACTION_SEARCH intent explicitly顯示的傳遞給searchable activity的。
4.2、執行搜索
當你在manifest文件中,聲明好了searchable activity,在你的searchable activity,就可以參照下面的3步執行搜索了。
(1),
提取搜索關鍵字
(2),
在你的數據中進行搜索
(3),
顯示搜索結果
一般來說,你的搜索結果需要要在ListView進行顯示,所有你的searchable activity需要繼承ListActivity。
它包括了一個擁有單一ListView的layout,它為我們使用ListView提供了方便。
4.2.1、提取搜索關鍵字
當用戶在search dialog or widget界面開始搜索的時候,系統將查找一個合適的searchable activity,並給它傳送一個ACTION_SEARCH的intent,該intent把搜索關鍵字保存在extra的QUERY中。當activity的時候,我們必須檢查保存在extra的QUERY中的搜索關鍵字,並提取它。
比如,
示例3:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
// Get the intent, verify the action and get the query
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
在Action為ACTION_SEARCH的intent中,extra的QUERY總是被包含。在示例3提取處理了搜索關鍵字,然後讓doMySearch()函數在執行真正的搜索的。
4.2.2、數據搜索
數據的存儲和搜索都是和你的程序相關的。你可以以各種方式進行數據的存儲和搜索,它才是你的程序更需要關注的。
但是還是有
幾點需要注意的:
(1),
當你的數據存儲在手機的數據庫中時,執行full-text search (using FTS3, rather than a LIKE query)
能提供在文本數據中得到更健壯且速度更快的search。在 sqlite.org 中可以得到FTS3的更多信息, 在
SQLiteDatabase
可以看到Android上的SQLite更多信息 . 可以在 Searchable Dictionary看到一個用FTS3實現搜索的示例。
(2),
如果的數據來自互聯網,那麼你的搜索將受制於用戶的數據連接情況。這時我們就需要顯示一個進度條,直到從網路返回搜索結果。
. 在 android.net
可一看到更多的network APIs ,在 Creating a Progress Dialog 可以到看到如何顯示一個進度條。
如果想讓的數據和搜索變得透明,那麼我建議你用一個Adapter返回搜索結果。這種方式,你更容易在ListView中顯示搜索結果。如果你的數據在自於數據庫,那麼通過CursorAdapter向ListView提供搜索結果,如果你的數據來自於其他方式,可以擴展一個BaseAdapter來使用。
4.2.3、結果顯示
正如上面討論的一樣,顯示搜索結果建議使用的UI是ListView,所以你的searchable activity最好繼承於ListActivity,然後是使用setListAdapter()來設置和搜索結果綁定了的Adapter。這樣你的搜索結果就可以顯示在ListView中了。
你可以參考 Searchable Dictionary 示例,它展示了怎麼進行數據庫查詢,怎麼使用Adapter向ListView提供搜索結果。