1. 程式人生 > >Android 新增一個搜尋功能

Android 新增一個搜尋功能

從android3.0以後,使用SearchView元件,可以在app bar新增一個搜尋功能,你可以定義SearchView什麼時候顯示,什麼時候不顯示。

新增SearchView在App Bar上

首先你要新建一個 menu 檔案,(所有要在bar中顯示的,都必須建立一個menu檔案)

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/search"
          android:title="@string/search_title"
android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" />
</menu>

使用 collapseActionView 可以使你的 searchView 擴充套件到整個bar,在不使用的時候,又摺疊刀普通的icon大小

<menu xmlns:android="http://schemas.android.com/apk/res/android"
>
<item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> </menu>

為了顯示出來:

public boolean onCreateOptionsMenu
(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return true; }

建立可搜尋的配置

一個 searchable configuration 決定了 SearchView 的行為,是定義在 res/xml/searchable.xml 檔案中的。

一個 searchable configuration 至少要有 android:lable 屬性,同時我們也可以新增一個 hint 屬性作為搜尋框的提示資訊

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

在你的 清單檔案 中,你得宣告一個 指向 res/xml/searchable.xml 的元資料<mata-data>,你的app才知道如何找到這個檔案

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

</activity>

onCreateOptionMenu() 方法中,會 setSearchableInfo(SearchableInfo) 方法來結合你的配置檔案和你的SearchView

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
           (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName())); // 這裡使用 getComponentName(),是因為之前定義 searchable 檔案的時候 lable 使用了 app_name

    return true;
}

建立一個搜尋Activity

當用戶提交一個搜尋請求的時候,你的需要一個Activity來處理這個搜尋動作

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>
public class SearchResultsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        ...
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {

        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search your data somehow
        }
    }
    ...
}