- 摘要
- 基础介绍
- 配置查询的xml文件
- 创建处理查询的activity
- manifest声明查询的activity
- 执行查询操作
目录
摘要
当你准备添加一个搜索功能到你的应用中时,Android通过使用search dialog或search widget帮你实现用户接口,search dialog和search widget两种方式都可以发送用户的查询数据到指定的activity,使用其中一种方式,在activity可能调用search dialog或search widget中初始化搜索对象,系统会启动合适的activity执行搜索并展示结果。
基础介绍
在开始开发搜索功能之前,你应该确定是使用search dialog实现搜索功能还是使用search widget,这两种方式提供的搜索功能稍微有点区别:
- search dialog是一个系统控件,当被用户激活时,search dialog出现在activity的顶部位置,如图 1。
Android系统控制着search dialog的所有事件,当用户提交查询,系统发送查询的内容到指定的activity处理搜索功能,同时配置好搜索提示
- search widget是SearchView实例对象,你可以放置在布局文件的任意位置。默认,search widget外观和EditText一样,但你可以通过配置search widget以便系统处理所有输入事件,并发送查询内容到指定的activity,同时也可以配置搜索提示。然而,search widget只在Android 3.0(API 11)系统之上可用
PS:如果你想要处理自定义处理所有的search widget输入,可以使用各种回调方法和监听器。可以参考《SearchView》
当用户执行一个来自search dialog或search widget的搜索时,系统会创建一个Intent并需要查询的内容保存在里面,然后系统启动被声明来处理查询的activity(searchable activity)和发送intent给它。查询助手的开发步骤:
- 配置查询的XML文件
- 创建处理查询的activity
- 指定查询接口:search dialog或search widget
配置查询的XML文件
在res根目录下创建文件夹xml(例如:res/xml/),然后新建一个xml文件,命名searchable.xml并保存在xml文件夹中,xml文件代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/app_label"
- android:hint="@string/search_hint" >
- </searchable>
android:label是唯一需要的属性,它指向一个字符串资源,该字符串是应用程序的名字。该标签实际上是不可见的,除非你开启了提示查询功能。那时,该标签会显示在系统配置的查询列表中。
android:hint属性虽说不是必须的,但还建议添加,因为它将会提示用户正确输入查询内容。
创建处理查询的activity
处理查询的activity接收用户输入的信息执行查询并展示结果。在使用search dialog或search widget执行查询时,系统会使用添加ACTION_SEARCH action的Intent启动处理查询的activity,代码如下:
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query = intent.getStringExtra(SearchManager.QUERY);
- SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
- MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
- suggestions.saveRecentQuery(query, null);
- doMySearch(query);
- }
manifest声明查询的activity
在manifest文件中添加如下代码:
- <application ... >
- <activity android:name=".SearchableActivity" >
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- </intent-filter>
- <meta-data android:name="android.app.searchable"
- android:resource="@xml/searchable"/>
- </activity>
- ...
- </application>
PS:上述
执行查询操作
一旦你在manifest文件中声明了你的searchable activity,在searchable activity执行查询的三个步骤:
- 接收查询字符串
- 执行查询操作
- 展示查询结果
接收查询字符串
当用户执行search dialog或search widget查询时,系统启动searchable activity并将ACTION_SEARCH intent发送给它,intent携带着用户输入的查询内容,在启动searchable activity时可以检查intent并提取查询内容,具体代码如下:
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.search);
- // Get the intent, verify the action and get the query
- Intent intent = getIntent();
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query = intent.getStringExtra(SearchManager.QUERY);
- doMySearch(query);
- }
- }
查询内容字符串被存储在ACTION_SEARCH intent里面,获取查询内容并在doMySearch()方法中操作
执行查询操作
存储和查询数据的操作在应用程序中是独立的,你可以使用很多种方式来存储和查询你的数据,这里是你可能需要应用的几个小步骤:
- 如果你的数据保存在SQLite数据库中,进行全文搜索(使用FTS3,而不是一个LIKE查询)可提供跨文本数据的更强大的搜索,可以更快地显著产生结果
- 如果你的数据存储在网络上,你需要显示一个进度条直到获取返回的数据,推荐阅读《Android开发之ProgressDialog读取文件进度解析》
不管你的数据存储在哪来和怎么获取查询的内容,我们建议使用适配器将结果返回到searchable activity中,然后可以简单使用ListView呈现结果内容,如果查询的内容来自SQLite数据库,使用的是CursorAdapter适配器,如果你的数据来自其它格式类型,你可以使用BaseAdapter。
展示查询结果
正如上一步所说的,查询内容需要在列表中展示,所以让searchable activity继承ListActivity,然后使用内部方法setListAdapter()传入绑定数据的Adapter对象即可。
指定查询接口:search dialog或search widget
search dialog和search widget在显示界面上有所区别,并在接口查询的activity调用方法不一样,关键代码如下:
- private void searchView(int id) {
- switch (id) {
- case SEARCH_DIALOG:
- mEditText = (EditText) findViewById(R.id.input_content);
- mEditText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onSearchRequested();
- }
- });
- break;
- case SEARCH_WIDGET:
- SearchView mSearchView = (SearchView) findViewById(R.id.searchView1);
- SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- mSearchView.setSearchableInfo(searchManager
- .getSearchableInfo(getComponentName()));
- mSearchView.setIconifiedByDefault(false);
- break;
- }
- }
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1569.html ,谢谢支持!