添加最近的查詢建議
使用Android搜索對話框或搜索小部件時,您可以根據最近的搜索查詢提供搜索建議。例如,如果用戶先前搜索過“小狗”,那麼一旦他或她開始鍵入相同的查詢,該查詢就會顯示爲建議。圖1顯示了包含最近查詢建議的搜索對話框的示例。
在開始之前,您需要在應用程序中實現搜索對話框或搜索小組件以進行基本搜索。如果還沒有,請參閱創建搜索界面。
基礎
最近的查詢建議只是保存的搜索。當用戶選擇其中一個建議時,您的可搜索活動會收到一個ACTION_SEARCH意圖,並將該建議作爲搜索查詢,您的可搜索活動已經處理該搜索查詢(如創建搜索界面中所述)。
要提供最近的查詢建議,您需要:
- 實現可搜索的活動,如創建搜索界面中所述。
- 創建一個擴展SearchRecentSuggestionsProvider的內容提供程序,並在應用程序清單中聲明它。
- 使用有關提供搜索建議的內容提供商的信息修改可搜索配置。
- 每次執行搜索時,都會將查詢保存到內容提供商。
就像Android系統顯示搜索對話框一樣,它也會在對話框或搜索小部件下方顯示搜索建議。您需要做的就是提供系統可以從中檢索建議的來源。
當系統確定您的活動是可搜索的並提供搜索建議時,用戶開始鍵入查詢後立即執行以下過程:
1.系統獲取搜索查詢文本(到目前爲止已輸入的內容)並對包含您的建議的內容提供者執行查詢。
2.您的內容提供商返回一個Cursor,指向與搜索查詢文本匹配的所有建議。
3.系統顯示Cursor提供的建議列表。
顯示最近的查詢建議後,可能會發生以下情況:
- 如果用戶鍵入另一個鍵,或以任何方式更改查詢,則重複上述步驟並更新建議列表。
- 如果用戶執行搜索,則會忽略建議,並使用正常的ACTION_SEARCH目標將搜索傳遞到您的可搜索活動。
- 如果用戶選擇建議,則使用建議的文本作爲查詢將ACTION_SEARCH意圖傳遞到您的可搜索活動。
您爲內容提供程序擴展的SearchRecentSuggestionsProvider類會自動完成上述工作,因此實際編寫的代碼非常少。
創建內容提供商
最近查詢建議所需的內容提供程序必須是SearchRecentSuggestionsProvider的實現。這個類幾乎爲你做了一切。您所要做的就是編寫一個執行一行代碼的類構造函數。
例如,這是最近查詢建議的內容提供程序的完整實現:
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()的調用傳遞了搜索權限的名稱和數據庫模式。搜索權限可以是任何唯一字符串,但最佳做法是爲內容提供程序使用完全限定名稱(包名稱後跟提供程序的類名稱;例如,“com.example.MySuggestionProvider”)。數據庫模式必須包含DATABASE_MODE_QUERIES,並且可以選擇包含DATABASE_MODE_2LINES,它會在建議表中添加另一列,允許您爲每個建議提供第二行文本。例如,如果要在每個建議中提供兩行:
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
現在,使用SearchRecentSuggestionsProvider類(以及可搜索的配置)中使用的相同權限字符串在應用程序清單中聲明內容提供程序。例如:
<application>
<provider android:name=".MySuggestionProvider"
android:authorities="com.example.MySuggestionProvider" />
...
</application>
修改可搜索配置
要配置系統以使用建議提供程序,您需要將android:searchSuggestAuthority和android:searchSuggestSelection屬性添加到可搜索配置文件中的<searchable>元素。例如:
<?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"
android:searchSuggestAuthority="com.example.MySuggestionProvider"
android:searchSuggestSelection=" ?" >
</searchable>
android:searchSuggestAuthority的值應該是內容提供者的完全限定名稱,該名稱與內容提供者中使用的權限(上例中的AUTHORITY字符串)完全匹配。
android:searchSuggestSelection的值必須是一個問號,前面有一個空格(“?”),它只是SQLite選擇參數的佔位符(它自動被用戶輸入的查詢文本替換)。
保存查詢
要填充最近查詢的集合,請將可搜索活動收到的每個查詢添加到SearchRecentSuggestionsProvider。爲此,請創建SearchRecentSuggestions實例,並在每次可搜索活動收到查詢時調用saveRecentQuery()。例如,以下是在活動的onCreate()方法中保存查詢的方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
suggestions.saveRecentQuery(query, null);
}
}
SearchRecentSuggestionsProvider構造函數需要您的內容提供者聲明的相同權限和數據庫模式。
saveRecentQuery()方法將搜索查詢字符串作爲第一個參數,並且可選地,將第二個字符串作爲建議的第二行(或null)。僅當您使用DATABASE_MODE_2LINES爲搜索建議啓用了雙線模式時,才使用第二個參數。如果您啓用了雙線模式,那麼當系統查找匹配建議時,查詢文本也會與第二行匹配。
清除建議數據
爲了保護用戶的隱私,您應始終爲用戶提供清除最近查詢建議的方法。要清除查詢歷史記錄,請調用clearHistory()。例如:
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();
從您選擇的“清除搜索歷史”菜單項,首選項或按鈕中執行此操作。您還應提供確認對話框,以驗證用戶是否要刪除其搜索歷史記錄。