【起航計劃 032】2015 起航計劃 Android APIDemo的魔鬼步伐 31 App->Search->Invoke Search 搜索功能 Search Dialog SearchView

Search (搜索)是Android平臺的一個核心功能之一,用戶能夠在手機搜索在線的或是本地的信息。Android平臺爲全部須要提供搜索或是查詢功能的應用提 供了一個統一的Search Framework來幫助實現Search功能。Search Framework的UI能夠有兩種形式:android

  • 屏幕頂部的Search Dialog:如Google Map提供的搜索條。
  • 能夠嵌到ContentView中的SearchView,應用能夠將它放在屏幕上任何地方。

 無論採用那種UI,Android系統均可以經過向某個指定Activity發送須要查詢的內容來幫助應用實現查詢功能。同時Android也支持查詢提示,以下圖所示:api

除此以外,Android查詢UI能夠支持:app

  • 語音查詢
  • 根據用戶輸入提供查詢提示列表
  • 支持應用自定義查詢提示列表來匹配用戶輸入
  • 在系統全局搜索(System-wide Quick Search Box)提供你的應用相關的查詢提示列表

Invoke Search介紹瞭如何使用Search Framework 並採用Search dialog 的方式在屏幕頂部顯示查詢條。下面結合例子介紹使用Search Framework的通常步驟:ide

 

Create a Search Interfaceui

例採用屏幕頂部Search Dialog的方式。在這種方式下,Android操做系統接管全部Search Dialog的事件,當用戶提交查詢後,Android系統將給支持的用來處理查詢的Activity發送消息。Search Dialog能夠提供查詢提示列表來匹配用戶輸入。this

用戶提交查詢後,Android系統構造一個Intent並把用戶的查詢內容放在這個Intent中。而後Android啓動你定義的用來處理用戶查詢的 Activity(稱爲Searchable Activity),並把這個Intent發給該Activity。爲了可以使用Android系統提供的Search Framework.須要如下幾步:spa

1. Creating a Searchable Configuration操作系統

首先定義一個Searchable configuration,用於描述Search Dialog 的一些屬性,該描述文件按慣例一般命名爲searchable.xml 並定義在/res/xml 目錄下:code

<!-- The attributes in this XML file provide configuration information -->
<!-- for the Search Manager. -->

<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint"
    
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
    android:voiceLanguageModel="free_form"
    android:voicePromptText="@string/search_invoke"

    android:searchSuggestAuthority="com.example.android.apis.SuggestionProvider"
    android:searchSuggestSelection=" ? "
/>

 

只有android:label是必須的,通常定義爲應用程序的名稱。儘管不是必須的,通常也會定義android:hint。這個屬性定義查詢框沒有任 何輸入時的背景文字。如上圖中的」Search the dictionary」 。本例中爲「Search Demo Hint」來提示用戶能夠輸入的內容。orm

2. Creating a Searchable Activity

一個」Searchable Activity」就是一個能夠用來處理Search Query 的Activity。和通常的Activity沒有太大分別。當用戶提交查詢後,Android會給這個「Searchable Activity」發送一個Intent包含有用戶查詢內容,同時這個Intent 含有ACTION_SEARCH action。

因爲能夠在任何一個Activity中使用Search Dialog或是SearchView,Android須要知道哪一個Activity是「Searchable Activity」,這就須要在AndroidManifest.xml中來定義「Searchable Activity」。

本例中 SearchQueryResults 定義爲「Searchable Activity」,它在AndroidManifest.xml中定義爲:

        <!-- This activity represents the "search" activity in your application, in which -->
        <!-- search results are gathered and displayed. -->

        <activity android:name=".app.SearchQueryResults"
                  android:label="@string/search_query_results">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>

            <!-- This intent-filter identifies this activity as "searchable" -->

            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <!-- This metadata entry provides further configuration details for searches -->
            <!-- that are handled by this activity. -->

            <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
        </activity>

 

Searchable Activity 須要在Intent-filter中指定android.intent.action.SEARCH,並在<meta-data>部分指定 searchable configuration (指向res/xml/searchable.xml)

SearchQueryResults 用來處理用戶查詢請求,本例爲簡單起見,只是在屏幕上顯示用戶查詢請求的內容。

它用來處理查詢請求Intent的代碼以下:

        if (Intent.ACTION_SEARCH.equals(queryAction)) {
            doSearchQuery(queryIntent, "onNewIntent()");
        }
        else {
            mDeliveredByText.setText("onNewIntent(), but no ACTION_SEARCH intent");
        }

 

若是請求的Action爲ACTION_SEARCH,代表該Activity是由Search Dialog觸發的,則調用doSearchQuery來顯示用戶查詢內容。此外這個Activity也能夠從Launcher啓動,此時Action不 含ACTION_SEARCH。

Using the Search Dialog

Search Dialog 先爲屏幕上方的浮動窗口,缺省爲不可見的。只有當調用onSearchRequested()或是用戶按「Search」鍵時(不是全部設備都有Search鈕,在模擬器上能夠用F5)Search Dialog纔會顯示。

爲了使用Search Dialog,咱們在AndroidManifest.xml定義了Searchable Activity: SearchQueryResults。 若是此時直接運行SearchQueryResults,在模擬器上按F5,將會在屏幕上方顯示Search Dialog。

若是如今Invoke Search (SearchInvoke)Activity也可使用Search Dialog, 也須要在AndroidManifest.xml作些說明:

        <activity android:name=".app.SearchInvoke"
                  android:label="@string/search_invoke">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>

            <!-- This metadata entry causes .app.SearchQueryResults to be the default context -->
            <!-- whenever the user invokes search while in this Activity. -->
            <meta-data android:name="android.app.default_searchable"
                       android:value=".app.SearchQueryResults" />

            <!-- This is not the typical way to define android.app.default_searchable, -->
            <!-- and we show it here only because we wish to confine the search demo to this -->
            <!-- section of the ApiDemos application. -->

            <!-- For typical applications, it's simpler to define android.app.default_searchable -->
            <!-- just once, at the application level, where it serves as a default for all of -->
            <!-- the Activities in your package. -->
        </activity>

 

這時按下 onSearchRequest() 或是 「Search」鍵就顯示Search Dialog,按查詢鍵後,將會在SearchQueryResults顯示用戶輸入的查詢內容:

此外咱們看到這Search Dialog下提供了最近用戶輸入做爲輸入提示,若是裏面含有敏感信息,能夠清除這個列表

    private void clearSearchHistory() {
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, 
                SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
        suggestions.clearHistory();
    }
相關文章
相關標籤/搜索