如果想要在应用里加入搜索功能,安卓可以帮助你实现顶部Activity窗口的搜索对话框,或是可以放置在布局里的搜索控件。搜索对话框和控件都可以把用户的查询关键词指向你应用中专门的Activity。如此一来用户便可以依靠搜索对话框和组件,在任意的Activity中发起搜索,系统也会开启相应的Activity完成搜索并列出结果。
搜索对话框和控件的其他特色还有:
语音搜索
根据近期的查询结果提供搜索建议
匹配你应用中实际结果的搜索建议
基础
搜索对话框和控件有相同的功能,但有些许的不同
搜索对话框是安卓系统控制的UI组件。用户激活它时,搜索对话框会出现在Activity的顶部,如图1.
安卓系统会监控该对话框内的所有事件。当用户提交搜索时,系统会将该关键词提供给你专门设置用来处理搜索的Activity。对话框同样会在用户输入时提供搜索建议
搜索控件则是SearchView对象,可以放置在布局中的任意位置。默认情况下它会类似一个EditText组件,不会有任何行为,但你可以对它进行相应的设置,这样安卓系统就会处理所有的输入事件,将搜索关键词提供给相应的Activity,并提供搜索建议(就如同搜索对话框一样)。不过搜索控件只支持API 11以上的版本。
注意:如果你希望的话,可以自己来处理搜索控件上的全部用户输入,通过各种回调方法和Listener。
用户从搜索对话框或控件执行搜索时,系统会创建一个Intent并保存进去用户的搜索关键词。系统就会开启你声明用来处理搜索的Activity并传入Intent。要给你的应用设置好这种搜索,你需要完成如下步骤:
1. 可搜索的设置
XML文件中设置搜索对话框或组件。包括语音搜索、搜索建议和搜索窗体里的提示文字等。
2. 可搜索的Activity
接收搜索关键词的Activity可以搜索你的数据,并将搜索结果展示出来
3. 搜索接口
由搜索对话框提供,搜索对话框默认是隐藏的,但当执行onSearchRequest方法时就会出现在屏幕顶端(当用户点击Search按钮时)
或是由SearchView组件提供
使用该组件可以让你在Activity的任意位置摆放搜索框。不过你应该更多的把它放在ActionBar里作为一个ActionView来使用。
创建可搜索配置
首先建立可搜索配置XML文件。配置搜索对话框的UI或是控件的UI,并定义搜索建议和语音搜索等特色。该文件一般会叫做searchable.xml并必须放置在res/xml文件夹下。
注意:系统会利用该文件创建一个SeachableInfo对象,但你绝不能在运行时自己创建该对象——一定要在XML文件中声明配置。
可搜索配置文件必须包括<searchable>根字节,并定义一或两个属性。如:
<?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属性是唯一必须的属性。它引用的字符串应该就是应用的名字。除非你开启Quick Search Box搜索建议,不然该标签一般都是不可见的。这时点标签是在系统设置里的可搜索项中可见。
虽然并非必须,我们还是推荐你一直写hint。
<searchable>节点还有其他几个属性。不过除非你需要使用语音搜索和搜索建议,不然你都用不上。(具体参考Searchable Configuration)
创建Searchable Activity
该Activity会根据搜索关键字字符串来执行搜索,并会提供搜索结果。
当用户执行搜索时,系统会开启该Activity并通过ACTION_SEARCH 这一action来将关键词封入Intent。搜索Activity会通过intent的QUERY来拿到关键字,然后搜索数据并提供结果。
系统必须了解哪个Activity是执行搜索的。所以一定要在Manifest文件里声明。
1. 声明Activity接受ACTION_SEARCH intent。在intent-filter中注明
2. 在<meta-data>中设置搜索配置。
如:
<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>
<meta-data>中一定要包含android:name="android.app.searchable
这一行,还要有android:resource="@xml/searchable"
注意:intentfilter里其实并不需要category那一行
执行搜索
声明完毕后,在搜索Activity中执行搜索需要三步
1. 拿到搜索关键字
2. 搜索数据
3. 提供结果
一般来说搜索结果是ListView的形式,所以可能要让searchable Activity继承ListActivity。该Activity包括了一个拥有单一ListView的默认布局,还会提供不少和ListView相关的便捷方法。
获取关键词
用户执行搜索后,系统会开启搜索Activity并塞给他一个ACTION_SEARCH的int