Android 新增一個搜尋功能
阿新 • • 發佈:2019-02-13
從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
}
}
...
}