Android基础搜索框架

安卓系统提供了比较完善的搜索解决方案,我们可以使用搜索对话框或是使用搜索控件来实现。

这里简单介绍下比较基础的使用搜索控件——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);
			}
		}


这是比较基本的一整套操作了,当然安卓还提供了很多强大的功能,如搜索时更强力的实时自动补全建议,语音搜索,有兴趣的童鞋可以参考官方文档或者其他博主的文章~_~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值