Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發指南(40) —— Adding Recent Query Suggestions

Android開發指南(40) —— Adding Recent Query Suggestions

編輯:Android開發實例

前言

  本章內容為 Android開發者指南的 Framework Topics/Search/Adding Recent Query Suggestions章節,譯為"增加最近查詢的建議項",版本為Android 4.0 r1,翻譯來自:"呆呆大蝦"。

 

增加最近查詢的建議項

譯者署名: 呆呆大蝦

譯者微博: http://weibo.com/popapa

版本:Android 4.0 r1

原文

         http://developer.android.com/guide/topics/search/adding-recent-query-suggestions.html

 

快速查看

·       Android系統把搜索請求從搜索對話框或widget發送給執行搜索並顯示結果的activity

·       可以把搜索widget作為“action view”放入Action Bar中,用於快速訪問

在本文中

簡介

創建Content Provider

修改搜索配置文件

保存搜索請求

清除建議項數據

關鍵類

SearchRecentSuggestions

SearchRecentSuggestionsProvider

參閱

搜索配置文件

 

使用Android的搜索對話框或者搜索widget時,可能需要根據最近的搜索請求提供搜索建議項。比如,假設用戶以前搜索過“puppies”,那麼一旦他開始鍵入同樣的請求時,這就可以作為建議項顯示出來。圖1展示了帶有最近求建議的搜索對話框。

 

 

 

1. 帶有最近請求建議的搜索對話框截屏

在開始前,需要為應用程序基本的搜索功能實現搜索對話框或搜索widget。如果沒有,請參閱創建搜索界面。

 

簡介

最近請求建議項只是簡單地保存了搜索文本。當用戶選中一個建議項時,搜索activity 會收到一個ACTION_SEARCH intent,其中附帶了作為搜索請求的建議項,該請求以前已經由搜索activity處理過的(如創建搜索界面所述)。

要提供最近請求建議功能,需要:

·       實現一個搜索activity,如創建搜索界面中所述。

·       創建一個繼承自SearchRecentSuggestionsProvider的content provider,並在manifest中進行聲明。

·       修改搜索配置文件中有關提供搜索建議項的content provider配置。

·       每次執行搜索後把請求保存到content provider中。

Android系統顯示搜索對話框時,也就會把搜索建議項顯示在對話框或搜索widget下面。所有需要做的事情就是提供數據源,系統能夠從中獲取建議項。

如果系統識別出activity是支持搜索功能並提供搜索建議的,則用戶一旦開始鍵入搜索請求,就會觸發以下動作:

1.     系統讀取搜索請求文本(輸入多少讀取多少)並在存放建議項的content provider中進行檢索。

2.     content provider返回一個Cursor,它指向匹配搜索文本的全部建議項。

3.     系統顯示該Cursor提供的建議項列表。

一旦最近請求建議項顯示完畢,將發生以下事情:

·       如果用戶鍵入其它字符,或者以其它任何方式修改了請求文本,則上述步驟會重復執行,建議項列表將同步更新。

·       如果用戶執行了搜索,建議項將被忽略,搜索文本將用正常的ACTION_SEARCH intent發送給搜索activity。

·       如果用戶選中了某個建議項,ACTION_SEARCH intent將把建議項文本作為請求發送給搜索activity。

作為content provider使用的SearchRecentSuggestionsProvider類會自動處理上述工作的,因此實際上只需要編寫很少量的代碼即可。

 

創建Content Provider

最近請求建議項需要用到的content provider必須是SearchRecentSuggestionsProvider的實現。該類幾乎處理了所有的事情,必需實現的只是編寫一個包含一行代碼的類構造方法。

以下是一個最近請求建議項所需的content provider完整的實現示例:

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()調用參數為搜索authority和數據庫模式。搜索authority可以是任何唯一的字符串,但最好是用content provider的完全限定名稱(包名加provider類名;比如“com.example.MySuggestionProvider”)。數據庫模式必須包括DATABASE_MODE_QUERIES,可選項DATABASE_MODE_2LINES會在建議項列表中添加一列,使得每個建議項能提供兩條文本。例如,要為每個建議項提供兩行文本:

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

下面在manifest文件中聲明content provider,authority串是與SearchRecentSuggestionsProvider類中(及搜索配置文件中)的相同:

<application> 

    <provider android:name=".MySuggestionProvider" 

              android:authorities="com.example.MySuggestionProvider" /> 

    ... 

</application>

 

修改搜索配置文件

為了能夠使用建議項provider,需要對系統進行配置,在搜索配置文件的<searchable>元素中添加android:searchSuggestAuthority 和 android:searchSuggestSelection 屬性。例如:

<?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的值必須是content provider的完全限定名稱,它必須與content provider使用的authority完全一致(上例中是AUTHORITY 字符串)。

android:searchSuggestSelection的值必須是空格加問號(" ?"),這只是一個SQLite查詢參數的占位符(將自動替換為用戶錄入的搜索請求文本)。

 

保存搜索請求

為了構建最近搜索請求的集合,需把搜索activity收到的所有請求都添加到SearchRecentSuggestionsProvider中去。要實現這一目標,請創建一個SearchRecentSuggestions的實例,每當搜索activity接受到請求時都調用一次saveRecentQuery()方法。下面是如何在activity的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 構造方法需要用到與content provider定義相同的authority 和數據庫模式。

saveRecentQuery()方法的第一個參數是搜索關鍵字,第二個參數包含建議項的第二行文本(或為空)。第二個參數只有用DATABASE_MODE_2LINES啟用兩行模式(two-line mode)時才會用到。如果啟用了兩行模式(two-line mode),系統在檢索建議項時,會同時把請求文本與第二行文本進行匹配。

 

清除建議項數據

為了保護用戶隱私,應該確保向用戶提供清除最近搜索建議項的功能。要清除搜索歷史記錄,調用clearHistory()即可。例如:

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, 

        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); 

suggestions.clearHistory();

可以選擇在“清除搜索歷史”菜單項、個人設置項或按鈕中執行此操作。還應該提供確認對話框來驗證用戶真的是需要刪除搜索歷史記錄。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved