Adding Recent Query Suggestions
版本:Android 4.0 r1
快速查看
·
·
在本文中
关键类
SearchRecentSuggestionsP
参阅
使用Android的搜索对话框或者搜索widget时,可能需要根据最近的搜索请求提供搜索建议项。比如,假设用户以前搜索过“puppies”,那么一旦他开始键入同样的请求时,这就可以作为建议项显示出来。图1展示了带有最近求建议的搜索对话框。
图1.带有最近请求建议的搜索对话框截屏
在开始前,需要为应用程序基本的搜索功能实现搜索对话框或搜索widget。如果没有,请参阅创建搜索界面。
最近请求建议项只是简单地保存了搜索文本。当用户选中一个建议项时,搜索activity 会收到一个ACTION_SEARCH intent,其中附带了作为搜索请求的建议项,该请求以前已经由搜索activity处理过的(如创建搜索界面所述).
要提供最近请求建议功能,需要:
·
·
·
·
Android系统显示搜索对话框时,也就会把搜索建议项显示在对话框或搜索widget下面。所有需要做的事情就是提供数据源,系统能够从中获取建议项。
如果系统识别出activity是支持搜索功能并提供搜索建议的,则用户一旦开始键入搜索请求,就会触发以下动作:
1.
2.
3.
一旦最近请求建议项显示完毕,将发生以下事情:
·
·
·
作为content provider使用的SearchRecentSuggestionsP
创建Content Provider
最近请求建议项需要用到的content provider必须是SearchRecentSuggestionsP
以下是一个最近请求建议项所需的content provider完整的实现示例:
publicclassMySuggestionProviderextendsSearchRecentSuggestionsP
}
setupSuggestions()调用参数为搜索authority和数据库模式。搜索authority可以是任何唯一的字符串,但最好是用content provider的完全限定名称(包名加provider类名;比如“com.example.MySuggestionProvider”)。数据库模式必须包括DATABASE_MODE_QUERIES,可选项DATABASE_MODE_2LINES会在建议项列表中添加一列,使得每个建议项能提供两条文本。例如,要为每个建议项提供两行文本:
publicfinalstaticint MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
下面在manifest文件中声明content provider,authority串是与SearchRecentSuggestionsP
<application>
</application>
为了能够使用建议项provider,需要对系统进行配置,在搜索配置文件的<searchable>元素中添加android:searchSuggestAuthority和android:searchSuggestSelection属性。例如:
<?xml version="1.0" encoding="utf-8"?>
<searchablexmlns:android="http://schemas.android.com/apk/res/android"
</searchable>
android:searchSuggestAuthority的值必须是content provider的完全限定名称,它必须与content provider使用的authority完全一致(上例中是AUTHORITY字符串)。
android:searchSuggestSelection的值必须是空格加问号(" ?"),这只是一个SQLite查询参数的占位符(将自动替换为用户录入的搜索请求文本)。
为了构建最近搜索请求的集合,需把搜索activity收到的所有请求都添加到SearchRecentSuggestionsP
@Override
publicvoid onCreate(Bundle savedInstanceState){
}
SearchRecentSuggestionsP
saveRecentQuery()方法的第一个参数是搜索请求文本,第二个参数包含建议项的第二行文本(或为空)。第二个参数只有用DATABASE_MODE_2LINES启用两行模式时才会用到。如果启用了两行模式,系统在检索建议项时,会同时把请求文本与第二行文本进行匹配。
为了保护用户隐私,应该确保向用户提供清除最近搜索建议项的功能。要清除搜索历史记录,调用clearHistory()即可。例如:
SearchRecentSuggestions suggestions =newSearchRecentSuggestions(this,
suggestions.clearHistory();
可以选择在“清除搜索历史”菜单项、个人设置项或按钮中执行此操作。还应该提供确认对话框来验证用户真的是需要删除搜索历史记录。