搜索最近搜索建议

前言

本章内容为 Android开发者指南的 Framework Topics/Search/Adding Recent Query Suggestions章节,译为"增加最近查询的建议项",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆大虾" !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://androidbox.sinaapp.com/

增加最近查询的建议项

译者署名:呆呆大虾

译者微博:http://weibo.com/popapa

版本:Android 4.0 r1

原文

http://developer.android.com/guide/topics/search/adding-recent-query-suggestions.html

快速查看

·Android系统把搜索请求从搜索对话框或widget发送给执行搜索并显示结果的activity

·可以把搜索widget作为“action view”放入Action Bar中,用于快速访问

在本文中

简介

创建Content Provider

修改搜索配置文件

保存搜索请求

清除建议项数据

关键类

SearchRecentSuggestions

SearchRecentSuggestionsProvider

参阅

搜索配置文件

使用Android的搜索对话框或者搜索widget时,可能需要根据最近的搜索请求提供搜索建议项。比如,假设用户以前搜索过“puppies”,那么一旦他开始键入同样的请求时,这就可以作为建议项显示出来。图1展示了带有最近求建议的搜索对话框。

1.带有最近请求建议的搜索对话框截屏

在开始前,需要为应用程序基本的搜索功能实现搜索对话框或搜索widget。如果没有,请参阅创建搜索界面

简介

最近请求建议项只是简单地保存了搜索文本。当用户选中一个建议项时,搜索activity会收到一个ACTION_SEARCHintent,其中附带了作为搜索请求的建议项,该请求以前已经由搜索activity处理过的(如创建搜索界面所述)。

要提供最近请求建议功能,需要:

·实现一个搜索activity,如创建搜索界面中所述。

·创建一个继承自SearchRecentSuggestionsProvider的content provider,并在manifest中进行声明。

·修改搜索配置文件中有关提供搜索建议项的content provider配置。

·每次执行搜索后把请求保存到content provider中。

Android系统显示搜索对话框时,也就会把搜索建议项显示在对话框或搜索widget下面。所有需要做的事情就是提供数据源,系统能够从中获取建议项。

如果系统识别出activity是支持搜索功能并提供搜索建议的,则用户一旦开始键入搜索请求,就会触发以下动作:

1.系统读取搜索请求文本(输入多少读取多少)并在存放建议项的content provider中进行检索。

2.content provider返回一个Cursor,它指向匹配搜索文本的全部建议项。

3.系统显示该Cursor提供的建议项列表。

一旦最近请求建议项显示完毕,将发生以下事情:

·如果用户键入其它字符,或者以其它任何方式修改了请求文本,则上述步骤会重复执行,建议项列表将同步更新。

·如果用户执行了搜索,建议项将被忽略,搜索文本将用正常的ACTION_SEARCHintent发送给搜索activity。

·如果用户选中了某个建议项,ACTION_SEARCHintent将把建议项文本作为请求发送给搜索activity。

作为content provider使用的SearchRecentSuggestionsProvider类会自动处理上述工作的,因此实际上只需要编写很少量的代码即可。

创建Content Provider

最近请求建议项需要用到的content provider必须是SearchRecentSuggestionsProvider的实现。该类几乎处理了所有的事情,必需实现的只是编写一个包含一行代码的类构造方法。

以下是一个最近请求建议项所需的content provider完整的实现示例:

publicclassMySuggestionProviderextendsSearchRecentSuggestionsProvider{

publicfinalstaticStringAUTHORITY="com.example.MySuggestionProvider";

publicfinalstaticintMODE=DATABASE_MODE_QUERIES;

publicMySuggestionProvider(){

setupSuggestions(AUTHORITY,MODE);

}

}

setupSuggestions()调用参数为搜索authority和数据库模式。搜索authority可以是任何唯一的字符串,但最好是用content provider的完全限定名称(包名加provider类名;比如“com.example.MySuggestionProvider”)。数据库模式必须包括DATABASE_MODE_QUERIES,可选项DATABASE_MODE_2LINES会在建议项列表中添加一列,使得每个建议项能提供两条文本。例如,要为每个建议项提供两行文本:

publicfinalstaticintMODE=DATABASE_MODE_QUERIES|DATABASE_MODE_2LINES;

下面在manifest文件中声明content provider,authority串是与SearchRecentSuggestionsProvider类中(及搜索配置文件中)的相同:

android:authorities="com.example.MySuggestionProvider"/>

...

修改搜索配置文件

为了能够使用建议项provider,需要对系统进行配置,在搜索配置文件的元素中添加android:searchSuggestAuthority和android:searchSuggestSelection属性。例如:

android:label="@string/app_label"

android:hint="@string/search_hint"

android:searchSuggestAuthority="com.example.MySuggestionProvider"

android:searchSuggestSelection=" ?">

android:searchSuggestAuthority的值必须是content provider的完全限定名称,它必须与content provider使用的authority完全一致(上例中是AUTHORITY字符串)。

android:searchSuggestSelection的值必须是空格加问号(" ?"),这只是一个SQLite查询参数的占位符(将自动替换为用户录入的搜索请求文本)。

保存搜索请求

为了构建最近搜索请求的集合,需把搜索activity收到的所有请求都添加到SearchRecentSuggestionsProvider中去。要实现这一目标,请创建一个SearchRecentSuggestions的实例,每当搜索activity接受到请求时都调用一次saveRecentQuery()方法。下面是如何在activity的onCreate()方法中保存搜索请求的示例:

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Intentintent=getIntent();

if(Intent.ACTION_SEARCH.equals(intent.getAction())){

Stringquery=intent.getStringExtra(SearchManager.QUERY);

SearchRecentSuggestionssuggestions=newSearchRecentSuggestions(this,

MySuggestionProvider.AUTHORITY,MySuggestionProvider.MODE);

suggestions.saveRecentQuery(query,null);

}

}

SearchRecentSuggestionsProvider构造方法需要用到与content provider定义相同的authority和数据库模式。

saveRecentQuery()方法的第一个参数是搜索关键字,第二个参数包含建议项的第二行文本(或为空)。第二个参数只有用DATABASE_MODE_2LINES启用两行模式(two-line mode)时才会用到。如果启用了两行模式(two-line mode),系统在检索建议项时,会同时把请求文本与第二行文本进行匹配。

清除建议项数据

为了保护用户隐私,应该确保向用户提供清除最近搜索建议项的功能。要清除搜索历史记录,调用clearHistory()即可。例如:

SearchRecentSuggestionssuggestions=newSearchRecentSuggestions(this,

HelloSuggestionProvider.AUTHORITY,HelloSuggestionProvider.MODE);

suggestions.clearHistory();

可以选择在“清除搜索历史”菜单项、个人设置项或按钮中执行此操作。还应该提供确认对话框来验证用户真的是需要删除搜索历史记录。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,386评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,345评论 0 17
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,393评论 2 45
  • 晚上接到了一个中年女人的电话,说她的老公又和她吵架云云,我问了问原因,果然不出所料,又是钱。大多数夫妻之间吵架的原...
    Ray先森爱健身阅读 1,481评论 22 30
  • 我想要一封你的婚礼请柬,无论多远都去看看你,我见过你开心的,难过的,温柔的,生气的模样,最后,我想看看,你属于...
    媳妇别闹biabiab阅读 149评论 1 1