標籤:android widget dialog search 架構
在Android上,搜尋是一個核心使用者特性。使用者可以搜尋可用的任何資料,不管內容是存促於裝置本身或者需要通過網路訪問。Android提供了一個搜尋方塊架為使用者建立一個一致的搜尋體驗,可以協助你實現搜尋應用程式。搜尋方塊架提供兩種搜尋模式:一個搜尋對話方塊(Search Dialog)位於搜尋螢幕的頂部或視窗小組件(SearchView),可以將其嵌入到你的布局中。在這兩種情況下,Android系統將協助你搜尋實現交付執行搜尋的任務給一個特定的Activity。效果如所示。
當使用者需要執行一個搜尋的搜尋對話方塊或搜尋小組件,系統建立一個Intent和儲存使用者Query,然後系統會啟動你事先聲明的用於執行資料尋找的Activity,,使用它進行資料搜尋。總共需要以下三個步驟。
(1)建立一個Search.XML檔案在res/xml檔案中
一個XML檔案,配置一些search dialog或widget的設定。它包括設定特性,比如語音搜尋,搜尋建議和提示文本搜尋方塊。
<?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>
(2)聲明一個SearchActivity
這個Activiy接收搜尋使用者的資料,並顯示搜尋結果。特別注意的是為了使調用的Activity找到這個SearchActivity,你必須首先聲明Android搜尋Activitydao到你的資訊清單檔。如下所示。
<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>
SearchActivity要完成以下三個步驟。1 接收查詢 2 搜尋您的資料3 展示結果。
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent());}@Overrideprotected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent);}private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); }}
之前看部落格又看到有人說onNewIntent()不知道幾時促發的,我研究了下官方文檔上面是這麼寫的。如果我們將android:launchMode設定為“singleTop”,然後SerachActivity接收ACTION_SEARCH intent 會調用 onNewIntent()方法。
(3)建立一個搜尋介面
搜尋介面包含兩種類型SearchDialog和SearchWidget。SerachDialog:預設情況下,搜尋對話方塊隱藏,我們通過調用onSearchRequested()(當使用者按搜尋按鈕)讓他顯示在螢幕上端,SearchWidget :允許使用者將搜尋方塊放在布局的任意位置,但通常需要跟actionbar結合。
搜尋介面的Activity也需要在資訊清單檔聲明
<activity android:name=".OtherActivity" ... > <!-- enable the search dialog to send searches to SearchableActivity --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> </activity>
public class OtherActivity extends Activity{ private Button mStartSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_invoke); //就一個按鈕 mStartSearch = (Button)findViewById(R.id.btn_start_search); //啟動搜尋方塊 mStartSearch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onSearchRequested(); } }); } //重寫onSearchRequested方法 @Override public boolean onSearchRequested() { //除了輸入查詢的值,還可額外綁定一些資料 Bundle appSearchData = new Bundle(); appSearchData.putString("demo_key","text"); startSearch(null, false, appSearchData, false); //必須返回true。否則繫結資料作廢 return true; } }
Android開發之核心特性SearchView的開發使用(原始碼分享)