在Android中,搜索是一個非常核心的功能,我們可以通過它搜索到任意我們可以獲得的信息。這些信息可以是存儲在手機中的聯系人、文件等信息,也可以是在網絡上的資源。
Android為了給用戶提供良好的搜索體驗,特意提供了一個搜索框架來方便開發者在自己的App中集成搜索功能。那么接下來我就學習一下這個搜索框架。
在Android的搜索框架中為我們提供了兩種搜索的UI控件,它們分別是:
- Search Dialog
Search Dialog就是浮動在Activity上方的,由系統管理的搜索控件。它不參與Activity的生命周期。
- Search Widget
Search Wiget這是一個類似於EditView的控件,你可以將它隨意擺放在任意你需要的位置。
這里我們主要學習Search Dialog的使用方法,Search Widget的使用方法讀者可以在http://developer.android.com/guide/topics/search/index.html中學習,有什么問題也可以跟我討論。
要使用Search Dialog,我們需要准備一下三個東西:
- A searchable configuration 這是一個xml的配置文件searchable.xml,並將其放在res/xml下
- A searchable activity 這是一個Activity,作用是用來處理用戶輸入的搜索關鍵字
- A search interface 這是一個搜索控件提供的接口,對於Search Dialog它提供的接口是onSearchRequested
根據以上三點,我們開始編寫一個簡單的包含搜索功能的App
1.編寫searchable configuration
searchable.xml文件內容如下,並將其放入工程的res/xml下面
<?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" > </searchable>
app_label一般指定App的名字,使用簡單的搜索功能時app_label是不可見的,只有將你的搜索功能加入到quick search box的時候,才會在quick search box的可搜索列表中出現。
search_hint就是當我們沒有任何輸入是出現在Search Dialog上的字符串
2.創建一個Searchable Activity
假設我們創建的Activity的名稱為SearchableActivity,那么在AndroidManifest中的配置如下:
<application ... > <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> ... </application>
其中android:name="android.app.searchable"告訴Android系統,SearchableActivity這個界面對android.intent.action.SEARCH敏感。
android:resource="@xml/searchable"則是來指定我們在第一步中的配置文件。
3.調用搜索接口並處理用戶輸入
上面我們只定義了一個處理搜索關鍵字的界面,接下來我們還要定義一個調用搜索接口的界面:
這里為了簡單期間,我只是在App的第一個界面MainActiviy中添加一個按鈕,然后通過按鈕來調用Search Dialog的搜索接口。
MainActiviy.onCreate
private Button button ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button) ; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onSearchRequested() ; //Search Dialog的調用接口 } }); }
MainActiviy對應的AndroidManifest配置
<activity android:name=".MainActivity" android:label="@string/app_name" > <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
其中
<meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" />指定了MainActivity調用Search Dialog的權利,並且指定了搜索處理界面SearchableActivity。
這里當點擊MainActivity上的button的時候,就會調用onSearchRequested(),來激活Search Dialog。接着當我在Search Dialog中輸入一些關鍵字並按確定時,系統會替我們發送一個包含了搜索關鍵字的Intent來啟動SearchableActivity這個界面。所以只要在SearchableActivity的onCreate方法中獲取intent,接着獲取搜索關鍵字,就能對其進行處理了。
SearchableActivity.onCreate
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent() ; if(Intent.ACTION_SEARCH.equals(intent.getAction())){ String query = intent.getStringExtra(SearchManager.QUERY) ; //獲取用戶輸入的關鍵字 Toast.makeText(this,"the query key is " + query,Toast.LENGTH_LONG).show(); //彈出用戶輸入的關鍵字,模擬搜索處理 } }
完成以上三步后,一個簡單的搜索Demo就做好了。效果圖如下:
MainActivity進行搜索
SearchableActivity處理關鍵字