編輯: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();
可以選擇在“清除搜索歷史”菜單項、個人設置項或按鈕中執行此操作。還應該提供確認對話框來驗證用戶真的是需要刪除搜索歷史記錄。
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
今天記錄一下TextView的倒影效果,顯示一串文字,然後在文字的下方顯示出它的倒影,先上效果圖: 最重要的就是View中getDrawingCache()方法
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個