Android 建立搜索界面

2018-08-02 18:10 更新

編寫:Lin-H - 原文:http://developer.android.com/training/search/setup.html

從Android 3.0開始,在action bar中使用SearchView作為item,是在你的app中提供搜索的一種更好方法。像其他所有在action bar中的item一樣,你可以定義SearchView在有足夠空間的時候總是顯示,或設置為一個折疊操作(collapsible action),一開始SearchView作為一個圖標顯示,當用戶點擊圖標時再顯示搜索框占據(jù)整個action bar。

Note:在本課程的后面,你會學習對那些不支持SearchView的設備,如何使你的app向下兼容至Android 2.1(API level 7)版本。

添加Search View到action bar中

為了在action bar中添加SearchView,在你的工程目錄res/menu/中創(chuàng)建一個名為options_menu.xml的文件,再把下列代碼添加到文件中。這段代碼定義了如何創(chuàng)建search item,比如使用的圖標和item的標題。collapseActionView屬性允許你的SearchView占據(jù)整個action bar,在不使用的時候折疊成普通的action bar item。由于在手持設備中action bar的空間有限,建議使用collapsibleActionView屬性來提供更好的用戶體驗。

<?xml version="1.0" encoding="utf-8"?>
<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>

Note:如果你的menu items已經(jīng)有一個XML文件,你可以只把<item>元素添加入文件。

要在action bar中顯示SearchView,在你的activity中onCreateOptionsMenu())方法內(nèi)填充XML菜單資源(res/menu/options_menu.xml):

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

    return true;
}

如果你立即運行你的app,SearchView就會顯示在你app的action bar中,但還無法使用。你現(xiàn)在需要定義SearchView如何運行。

創(chuàng)建一個檢索配置

檢索配置(searchable configuration)在 res/xml/searchable.xml文件中定義了SearchView如何運行。檢索配置中至少要包含一個android:label屬性,與Android manifest中的<application><activity>android:label屬性值相同。但我們還是建議添加android:hint屬性來告訴用戶應該在搜索框中輸入什么內(nèi)容:

<?xml version="1.0" encoding="utf-8"?>

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

在你的應用的manifest文件中,聲明一個指向res/xml/searchable.xml文件的<meta-data>元素,來告訴你的應用在哪里能找到檢索配置。在你想要顯示SearchView<activity>中聲明<meta-data>元素:

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

</activity>

在你之前創(chuàng)建的onCreateOptionsMenu())方法中,調(diào)用setSearchableInfo(SearchableInfo))把SearchView和檢索配置關聯(lián)在一起:

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

    // 關聯(lián)檢索配置和SearchView
    SearchManager searchManager =
           (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    return true;
}

調(diào)用getSearchableInfo())返回一個SearchableInfo由檢索配置XML文件創(chuàng)建的對象。檢索配置與SearchView正確關聯(lián)后,當用戶提交一個搜索請求時,SearchView會以ACTION_SEARCH intent啟動一個activity。所以你現(xiàn)在需要一個能過濾這個intent和處理搜索請求的activity。

創(chuàng)建一個檢索activity

當用戶提交一個搜索請求時,SearchView會嘗試以ACTION_SEARCH啟動一個activity。檢索activity會過濾ACTION_SEARCH intent并在某種數(shù)據(jù)集中根據(jù)請求進行搜索。要創(chuàng)建一個檢索activity,在你選擇的activity中聲明對ACTION_SEARCH intent過濾:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

在你的檢索activity中,通過在onCreate())方法中檢查ACTION_SEARCH intent來處理它。

Note:如果你的檢索activity在single top mode下啟動(android:launchMode="singleTop"),也要在onNewIntent())方法中處理ACTION_SEARCH intent。在single top mode下你的activity只有一個會被創(chuàng)建,而隨后啟動的activity將不會在棧中創(chuàng)建新的activity。這種啟動模式很有用,因為用戶可以在當前activity中進行搜索,而不用在每次搜索時都創(chuàng)建一個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);
            //通過某種方法,根據(jù)請求檢索你的數(shù)據(jù)
        }
    }
    ...
}

如果你現(xiàn)在運行你的app,SearchView就能接收用戶的搜索請求,以ACTION_SEARCH intent啟動你的檢索activity?,F(xiàn)在就由你來解決如何依據(jù)請求來儲存和搜索數(shù)據(jù)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號