Android官方文檔—User Interface(Search)(Adding Recent Query Suggestions)

添加最近的查詢建議

使用Android搜索對話框或搜索小部件時,您可以根據最近的搜索查詢提供搜索建議。例如,如果用戶先前搜索過“小狗”,那麼一旦他或她開始鍵入相同的查詢,該查詢就會顯示爲建議。圖1顯示了包含最近查詢建議的搜索對話框的示例。

在開始之前,您需要在應用程序中實現搜索對話框或搜索小組件以進行基本搜索。如果還沒有,請參閱創建搜索界面。

基礎


最近的查詢建議只是保存的搜索。當用戶選擇其中一個建議時,您的可搜索活動會收到一個ACTION_SEARCH意圖,並將該建議作爲搜索查詢,您的可搜索活動已經處理該搜索查詢(如創建搜索界面中所述)。

圖1.包含最新查詢建議的搜索對話框
的屏幕截圖。

要提供最近的查詢建議,您需要:

  • 實現可搜索的活動,如創建搜索界面中所述。
  • 創建一個擴展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();

從您選擇的“清除搜索歷史”菜單項,首選項或按鈕中執行此操作。您還應提供確認對話框,以驗證用戶是否要刪除其搜索歷史記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章