原文地址:http://developer.android.com/guide/topics/search/adding-recent-query-suggestions.html
當你使用search dialog or search widget的時候, 你可以提供基於recent search queries的provide search suggestions.
比如所用戶以前搜索過"puppies," 當用戶開始輸入和他一樣的時候,這個query將出現在suggestion中.
圖一就是一個在search dialog中使用recent query suggestions的界面圖。
圖一:
在開始實現recent search queries之前,你需要在你的程序中實現search dialog or a search widget基本的搜索 。
關於他們的更多內存請參照《Searchable》系列
基本
Recent query suggestions僅僅是保存搜索過的searches。當用戶選擇了一個suggestions的時候,你的searchable activity將收到一個把suggestion作為搜索關鍵字的ACTION_SEARCH intent,其實你的searchable activity曾經也處理過它。
為了提供recent queries suggestions, 你需要以下幾步:
A、 實現一個searchable activity
B、創建一個繼承於SearchRecentSuggestionsProvider的content provider類,並在你的manifest中聲明它。
C、在searchable配置文件中配置提供search suggestions的content provider.
D、當每次執行搜索的時候,把你的搜索關鍵字保存你的content provider中
當系統顯示search dialog或search widget的時候,就會在它們下面顯示 search suggestions。你所需要做的就是為系統提供提取suggestions的source。
一旦系統識別到了你的searchable activity並且你提供的search suggestions, 當用戶鍵入查詢語句的時候,將執行下面的流程:
1.系統取得用戶當前已經輸入的搜索關鍵字,並在你的content provider(suggestions)執行查詢
2.你的content provider用Cursor返回一個和搜索關鍵字相匹配的所有suggestions
3.系統以列表的形式顯示由Cursor提供的suggestions
一旦recent query suggestions被顯示, 下面的幾種情況之一將發生:
A,如果用戶繼續鍵入搜索關鍵詞,或以任何方式改變了搜索關鍵詞,上面的行為將重復,suggestion list也將更新
B,如果用戶執行搜索的話,suggestions將被忽略,用戶輸入的搜索關鍵詞將通過ACTION_SEARCH intent傳遞到你的searchable activity
C,如果用戶選擇了一個suggestion, 將使用這個suggested text做為查詢關鍵字從ACTION_SEARCH intent傳遞到你searchable activity
你的繼承自SearchRecentSuggestionsProvider的content provider將自動的做上面的工作,所以實事上你只有很少的代碼需要編寫。
創建Content Provider
你用於recent query suggestions的content provider必須是一個SearchRecentSuggestionsProvider的實現。實際上它已經為你提供了所有的東西。你所需要的就是重寫構造函數來加上一行代碼
比如下面就是一個recent query suggestions的content provider的完整實現。
示例1:
public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.example.MySuggestionProvider";
public final static int MODE = DATABASE_MODE_QUERIES;
public MySuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
調用setupSuggestions()
需要兩個參數,一個是搜索的授權名,另一個是數據庫的模式。搜索授權必須是unique的字符串,但是一般最好的就是使用你的content provider的qualified name(包名加上provider的類名; 比如 "com.example.MySuggestionProvider"). 數據庫模式必須包含DATABASE_MODE_QUERIES,也可以加上可選項
DATABASE_MODE_2LINES。
它將在suggestions表的基礎上再加入一行,它允許你為每個suggestion再添加一行文本。比如,你想讓沒suggestion都有2行的話,可以這樣:
示例2:
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
注意你在manifest為該content provide聲明的授權必須和setupSuggestions(AUTHORITY, MODE);中聲明的授權一樣。
比如:示例2:
<application>
<provider android:name=".MySuggestionProvider"
android:authorities="com.example.MySuggestionProvider" />
...
</application>