安卓系统提供了比较完善的搜索解决方案,我们可以使用搜索对话框或是使用搜索控件来实现。
这里简单介绍下比较基础的使用搜索控件——SearchView来处理搜索的步骤:
1.在res/下建立xml文件夹,再在下创建一个searchable.xml的文件,内容如下例:
<?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/abc_searchview_description_query"
android:searchSuggestAuthority="com.lttclaw.MySuggestionProvider"
android:searchSuggestSelection=" ?" >
</searchable>
2.修改Manifest.xml,在要处理搜索的Activity下加上intent filter与metadata,此处我用于处理搜索结果的activity为NewActivity,而SearchView所在的Activity也为同一个,所以我加上了singleTop,以处理onNewIntent()回调
<activity android:name="com.lttclaw.afinal.NewActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
3.在搜索控件所在Activity配置SearchView
searchv.setSubmitButtonEnabled(true);
SearchManager manager=(SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchv.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
searchv.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String arg0) {
searchv.setIconified(true);
return false;
}
@Override
public boolean onQueryTextChange(String arg0) {
return false;
}
});
这个里面只有setSearchableInfo是必须要设置的,注意,如果你的处理搜索结果的Activity与SearchView所在Activity不是同一个,那么setSearchableInfo应该使用new ComponentName(..)来指定你的处理搜索的Activity,切记!!
4.如果SearchView和处理搜索不是一个Activity,在处理搜索结果的Activity的onCreate()里用getIntent()得到搜索的数据,如果和我一样是同一个,就在onNewIntent()里用那个intent,(注意,如果要像我这样用,一定要加上singleTop或singleInstance的LaunchMode)。
5.如果只是提供历史记录搜索提示,建立一个继承自SearchRecentSuggestionsProvider的Provider,
public class MySuggestinProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.lttclaw.MySuggestionProvider";
public final static int MODE = DATABASE_MODE_QUERIES;
public MySuggestinProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
6.在Manifest.xml里注册这个provider并指定其Authority,这个类名对应了searchable.xml中的searchSuggestAuthority
<provider android:name="com.lttclaw.afinal.MySuggestinProvider"
android:authorities="com.lttclaw.MySuggestionProvider"></provider>
7.处理拿到搜索数据的Intent
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
if (checkInput(query)) {//验证用户输入合法性
doMyQuery(query);//处理自己的搜索逻辑,如数据检索、listview数据适配等
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
this, MySuggestinProvider.AUTHORITY,
MySuggestinProvider.MODE);
suggestions.saveRecentQuery(query, null);
}
}