- 浏览: 259596 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yzb808:
Arrays.asList(ubs)在每次调用switchCh ...
UnicodeBlock(解决中文中方块乱码) -
ejb2008:
感谢楼主,写的太详细了。谢谢分享。
UML类图几种关系的总结 -
ld1024:
很有帮助,写的很好
UML类图几种关系的总结 -
王静娜:
这篇文章写得真不错
UML类图几种关系的总结 -
binzhao88:
EditText和ImageSpan
原文:http://mobile.51cto.com/abased-351703.htm
什么是搜索建议
首先我们来看下什么是搜索建议。在Android应用中,当用户输入搜索字符串是,系统会根据输入的字符串的部分或整体,以下拉框的方式列出含有用户输入字符串的列表,这样用户就可以不必输入完所有字符,可以直接从下拉列表中选择,方便了用户。如果能在APP应用的搜索模块中加入这个功能,对用户来说无疑是十分方便的,下图是在搜索应用中使用搜索建议的图:
搜索建议的两类模式
要让搜索应用支持搜索建议,必须在应用中增加一个自定义的content provider,并且要设置配置文件中的搜索元数据。
Android支持两种类型的搜索建议模式:
· 基于用户输入的搜索建议
· 基于APP应用本身数据库的搜索建议,即从APP应用数据库中提取数据做搜索建议
下面分别讲解两种搜索建议方式是如何配置的:
基于用户输入的搜索建议
这种方式相对比较容易,先来介绍下。在Android中,提供了SearchRecentSuggestionsProvider这个类,可以实现从用户最近输入的内容中进行检索,开发者只需要做的,只需要继承这个类,并且在构造函数中进行如下设置:
- import android.content.SearchRecentSuggestionsProvider;
- publicclass SampleRecentSuggestionsProvider
- extends SearchRecentSuggestionsProvider {
- public static final String AUTHORITY =
- SampleRecentSuggestionsProvider.class.getName();
- public static final int MODE =DATABASE_MODE_QUERIES;
- public SampleRecentSuggestionsProvider() {
- setupSuggestions(AUTHORITY, MODE);
- }
- }
在上面的这个类中,继承了SearchRecentSuggestionsProvider,并且在构造函数中进行了设置,这样这个自定义的contentprovider就拥有了查询用户最近输入检索的能力了。
但必须同时保存用户曾经的检索输入,这样就能在用户再次输入时,重新显示出来,这个必须在search的activity中,写入如下代码:
- SearchRecentSuggestions suggestions =
- newSearchRecentSuggestions(this,
- SampleRecentSuggestionsProvider.AUTHORITY,
- SampleRecentSuggestionsProvider.MODE);
- suggestions.saveRecentQuery(query, null);
上面的代码中可以看到,使用了SearchRecentSuggestionsProvider的
saveRecentQuery方法进行了搜索记录的保存。
接下来,在配置文件中必须对这个contentprovider进行配置,如下:
- <provider
- android:authorities="de.openminds.SampleRecentSuggestionsProvider"
- android:name=".SampleRecentSuggestionsProvider">
- </provider>
最后,在searchable.xml中进行配置即可使用,如下:
- <? xml version="1.0"encoding="utf-8"?>
- <searchablexmlns:androidsearchablexmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/search_label"
- android:hint="@string/search_hint"
- android:searchSettingsDescription="@string/search_settings_description"
- android:searchSuggestAuthority="com.grokkingandroid.SampleRecentSuggestionsProvider "
- android:searchSuggestIntentAction="android.intent.action.SEARCH"
- android:searchSuggestThreshold="1"
- android:includeInGlobalSearch="true"
- android:searchSuggestSelection=" ?"
- >
- </searchable>
其中的一些参数说明如下:
android:searchSuggestAuthorith
此属性的值就是SearchSuggestAuthorith中的AUTHORITH了。
android:searchSuggestIntentAction
此属性定义了当我们选中搜索提示的内容时发生的目的动作。
android:searchSuggestThreshold
此属性定义了至少输入几个字符时才会弹出提示
android:includeInGlobalSearch
是否将内容加入android的全局搜索。true,加入。
android:searchSuggestSelection
定义搜索时参数的占位符
Android中数据库保存的搜索记录
SearchRecentSuggestionsProvider将用户最近的搜索记录保存在suggestions.db中,这个db保存了id,query查询项,一个显示的文本和搜索时候的时间戳。注意的是这个时间戳是必须的,因为所有的搜索记录都是按时间排序的。
作为开发者来说,应该考虑定期清理搜索记录,或者提供给用户手动清除搜索记录的机会,以让用户定期从搜索建议列表中看到更多的搜索建议项。清除搜索建议记录是十分容易的,只需要调用SearchRecentSuggestions对象的clearHistory()方法即可。Android会默认保留250个搜索建议项在系统中。
基于应用的搜索建议
在更多情况下,开发者希望是提供给用户基于app应用本身的搜索功能,这样用户在搜索时,将基于APP应用本身的内容提供给用户搜索建议。这个时候,在自定义provider中,只需要关注query()和getContentType()就可以了。
首先,在应用中必须获得用户在搜索文本框中输入的内容,然后再调用query()方法去搜索app应用。这个可以通过如下两类方法去获得用户的输入内容
· 默认的是通过URI的方式获得用户的输入内容
· 在配置文件中的查询字符串
先看下如何过URI的方式获得用户的输入内容。系统都会通过query()函数在Content Provider中进行查询,然后用Cursor返回对应的suggestion。系统对用户的输入,构造成如下的URI:
content://authority/optionalPath/SUGGEST_URI_PATH_QUERY /queryText
注意这里的Uri末尾的querytext是用URL方式进行编码的,所以你需要解码。
一般都是采用如下的方式取得它:Stringquery = uri.getLastPathSegment().toLowerCase();
这里的optional.suggest.path就是在searchable配置文件中设置的android:searchSuggestPath,如果在searchable配置文件没有设置它,optional.suggest.path当然也不会包括在uri中。只有需要一个ContentProvider为多个searchable activities提供suggestions查询的时候,才需要设置android:searchSuggestPath,这时它用于区分是哪个searchableactivities。
注意:SUGGEST_URI_PATH_QUERY 并不是URI的字面字符串,它是一个静态成员常量,表示是把该常量的值加到uri中
下面是相关的使用方法代码:
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder){
- String query = uri.getLastPathSegment();
- if (SearchManager.SUGGEST_URI_PATH_QUERY.equals(query)) {
- //如果找到符合用户输入的记录
- }
- else {
- //如果找不到符合用户输入的记录
- }
- }
接着看下如何在配置文件中进行查询字符串的设置。可以在配置文件中进行如下配置,增加android:searchSuggestSelection选项,如下:
android:searchSuggestSelection="namelike ?"
那么query()方法代码如下:
- public Cursor query(Uri uri, String[]projection, String selection,
- String[]selectionArgs, String sortOrder) {
- if (selectionArgs!= null && selectionArgs.length > 0 &&selectionArgs[0].length() > 0) {
- // 用户输入内容保存在 selectionArgs[0] 中
- }
- else {
- // 用户没输入任何内容
- }
- }
此外,还可以在配置文件中配置搜索建议的最短字符数,比如android:searchSuggestThreshold="3",则表明,用户至少输入3个字符后,才开始调用搜索建议项。
处理返回的结果
下面讲解如何处理搜索建议返回给前端界面的问题。首先要在配置文件中,配置使用哪个action并且使用哪一个URI(这个URI其实就是搜索建议项的最后数据来源列表),配置如下:
android:searchSuggestIntentAction =
"android.intent.action.VIEW" android:searchSuggestIntentData = "content://someAuthority/somePath" |
对返回的搜索建议项,是以一个cursor的方式返回的,各个列必须严格遵守相关的规定,下面是几个重要的列的列表:
常量 |
用法 |
SUGGEST_COLUMN_TEXT_1 |
要在第一行显示的文本 |
SUGGEST_COLUMN_TEXT_2 |
在第二行显示的文字 |
SUGGEST_COLUMN_INTENT_DATA_ID |
添加到data_uri的额外的id |
虽然说只有Searchmanager.SUGGEST_COLUMN_TEXT_1是强制要求的,但由于要知道用户选择的是哪一个选项,因此一般来说,id选项也是需要的。
此外,还需要将查询出来的搜索数据转换为cursor的数据格式,这个需要进行一点转换工作。这可以使用SQLITEQueryBuilder的setprojectionMap方法进行转换,在下一篇教程中,将会具体讲解其用法,这里先列出相关代码如下:
- Map<String, String> projectionMap = newHashMap<String, String>();
- projectionMap.put(COL_BAND, COL_BAND +" AS " + SearchManager.SUGGEST_COLUMN_TEXT_1);
- projectionMap.put(COL_ID, COL_ID);
- projectionMap.put(COL_ROW_ID,COL_ROW_ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
- projectionMap.put(COL_LOCATION,COL_LOCATION + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_2);
- projectionMap.put(COL_DATE, COL_DATE);
- builder.setProjectionMap(projectionMap);
响应用户搜索的intent
当用户输入搜索词后,Android的搜索框架将调用manifest文件中配置的搜索的activity,这其中会使用显式的intent去实现。就在app中搜索用的搜索建议而言,这个intent会包括在配置文件中的数据和从cursor中返回的数据。
对用户搜索的响应的具体处理,取决于使用的是基于用户已经输入过的搜索词的搜索建议,还是基于APP应用本身数据提供的搜索建议。
如果使用了基于用户已经输入过的搜索词的搜索建议,那么intent的action就是Intent.ACTION_SEARCH ,这和上一篇教程中谈到的是一样的。
对于基于APP应用本身数据提供的搜索建议的情况,用户大多数情况下,希望看到的是数据的详细的情况,所以点了提供的搜索建议后,期望跳转看到数据的详情,这个可以通过设置Intent.ACTION_VIEW来实现。
由于搜索的activity一般会继承ListActivity,所以一般情况下需要另外打开一个activity去查看某项数据的具体内容,代码如下:
- private void handleIntent(Intentintent) {
- if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query =intent.getStringExtra(SearchManager.QUERY);
- doSearch(query);
- } else if(Intent.ACTION_VIEW.equals(intent.getAction())) {
- Uri detailUri =intent.getData();
- String id = detailUri.getLastPathSegment();
- Intent detailsIntent =new Intent(getApplicationContext(), DetailsActivity.class);
- detailsIntent.putExtra("ID", id);
- startActivity(detailsIntent);
- finish();
- }
- }
全局搜索
对于全局搜索的设置,只需要在配置文件中进行如下设置:
android:includeInGlobalSearch="true"
但问题是如何将你的APP应用能放置到Android本身的搜索列表中去呢?如下图:
你的APP应用本身不能改变这些值,但Android提供了
android.app.SearchManager.INTENT_ACTION_GLOBAL_SEARCH
的方法,可以将你的APP应用添加到搜索列表中去,这样的话,在搜索列表中,可以象如下图的样子进行搜索:
关于搜索建议最大的问题
要注意的是关于搜索建议最大的问题,在于开发者很难在样式上进行控制,这将会是一个很大的问题。特别对于APP中如果搜索建议展示的样式跟APP中其他的样式很不同的话,将会影响用户体验。
另外,如果要在搜索建议中展示不同的数据 ,有的时候也会变得麻烦。比如在一个关于音乐会的app应用中,可能会出现位置和乐团或乐队的相关信息,开发者企图将它们在搜索建议中明确划分开来,以方便用户选择,但可惜除非开发者进行自定义开发,否则无法实现这样的功能。
小结
在本篇教程中,重点讲解了如何在APP应用中加入搜索建议的两种方法和注意点,在下一篇教程中,将讲解如何使用搜索的快捷方式,敬请期待。
发表评论
-
【Android笔记】各个屏幕的logo尺寸要求
2015-07-31 15:29 2800Android Icon Size and Location ... -
oauth2.0认证和授权原理
2015-07-01 16:02 1006【转:http://www.phpddt.com/%E4%B ... -
解决Android单个dex文件不能超过65536个方法问题
2015-06-23 23:50 1835当我们的项目代码过大时,编译运行时会报Unable to e ... -
Android涉及到的设计模式
2015-06-23 18:23 625【转:http://blog.csdn.net/dengsh ... -
android camera拍照失真问题
2015-03-10 18:12 2698项目中遇到各种失真,例如图片变绿,图片曝光严重,出现两个图片 ... -
px,dp,sp
2015-03-05 17:10 9001、px 像素,1px代表屏幕上一个物理的像素点,px单位 ... -
关于build.prop原始Dalvik虚拟机设定与调整
2015-03-05 16:41 1701看了很多帖子,自己亲身实践了一下。有不足希望高手指出来,共同 ... -
android有时候相机对焦成功,照片却模糊
2014-08-07 16:42 1978急急急!!! android有的相机有时候对焦成功, ... -
Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
2014-07-11 10:57 956SQLite数据库简单的认识 ... -
android 反射的使用场景
2013-12-26 17:34 1342【转】http://mysuperbaby.iteye.co ... -
webview原始大小时如何缩小网页
2013-12-26 14:33 1004webview原始大小的时候,没办法缩小。 这个如何处理, ... -
更改eclipse关联的源码(重新关联源码)
2013-12-26 14:28 1137在项目上点右键-->build path-->co ... -
webview内嵌listview
2013-11-05 16:09 1654webview的header中是一个listview。 想 ... -
default.properties的target和AndroidManifest中的android:minSdkVersion
2013-10-12 10:45 1573客户反馈,在2.X系统运行有问题。 查看工程配置。 发 ... -
自定义ProgressBar的加载效果
2013-09-24 18:19 1476【转】http://gundumw100.iteye.com ... -
sqlite cmd 控制台中文乱码
2013-09-08 15:01 1016打开CMD.exe命令行窗口通过 chcp命令改变代码页,U ... -
ADT17以后关联源码方法
2013-08-26 22:37 823在libs目录下建与jar包同名(包括.jar)的prope ... -
java学习笔记:常见字符编码和编码头BOM
2013-06-28 11:00 1098ANSI(American National Standar ... -
非法字符: \65279 (utf-8 BOM标记)
2013-06-28 10:57 5597Linux先使用grep -r $'\xEF\xBB\xB ... -
如何混淆Android项目代码(ProGuard)
2013-05-09 14:33 2665ProGuard简介 ProGuard是 ...
相关推荐
总结来说,Android调用系统搜索框涉及到创建Intent、配置搜索意图、处理搜索结果以及集成语音搜索。通过这些技术,开发者可以为用户提供更加便捷和自然的搜索体验。在实际开发中,还可以根据应用的需求进一步优化...
本文将详细介绍如何在Android中调用系统的浮动搜索框来实现这一功能,以此来帮助开发者构建高效、直观的搜索界面。 首先,我们要明白系统浮动搜索框(通常称为全局搜索)是Android系统提供的一种全局搜索机制,它...
在实现“android edit listview 搜索框”时,主要涉及到以下几个关键知识点: 1. **EditText组件**:搜索框通常由EditText组件来创建。EditText是Android中的文本输入框,用户可以在其中输入文字。我们需要为...
本教程将指导你如何在你的应用程序中使用Android的搜索对话框(浮动搜索框)。 首先,你需要创建一个搜索对话框的配置文件。这个文件通常命名为`searchable.xml`,并存储在`res/xml`目录下。配置文件的主要目的是...
在Android开发中,自定义搜索框是一个常见的需求,它能够为用户提供更加个性化和符合应用风格的搜索体验。本文将深入探讨如何使用PopupWindow来实现一个自定义的搜索框。 首先,我们来理解什么是PopupWindow。...
在Android系统中,浮动搜索框(FloatSearchBox)是一种常见的用户界面组件,它提供了一种高效、直观的方式来实现搜索功能。这种设计模式通常用于应用程序,尤其是那些需要快速访问搜索功能或者在多信息环境中导航的...
本篇文章将深入探讨如何实现一个通用的Android搜索框,并提供相关的源码解析。 首先,通用搜索栏的设计应具备以下特性: 1. **可定制性**:为了适应不同的UI设计和功能需求,搜索框需要具有高度的可定制性,包括但...
在这个"Android高仿QQ搜索框动画效果"中,我们可能会用到属性动画,因为这种动画更加灵活,可以实现更为复杂的动画效果。动画的实现通常涉及以下步骤: 1. 创建动画对象:使用`ObjectAnimator`或`ValueAnimator`来...
总结一下,实现Android浮动搜索框的关键步骤包括:在布局文件中创建搜索框组件,处理搜索按钮点击事件,实现实时搜索功能,以及与系统搜索服务集成。每个步骤都需要根据具体应用的功能和需求进行调整和优化,以提供...
6. **搜索功能**:为了实现应用搜索,可以在`GridView`上方添加一个搜索框,监听其输入事件。根据输入关键字,过滤出包含关键字的应用,并更新`GridView`的适配器数据。这可能需要用到`String.contains()`方法来判断...
本文将详细介绍如何在Android中实现搜索框,主要关注XML布局和继承RelativeLayout这两种方法,以及它们在API 14及以上版本中的应用。 ### XML布局实现 XML布局是最常见的创建Android界面的方法。在`res/layout`...
我们可以添加一个TextWatcher监听器,每当用户在搜索框输入文字时,TextWatcher的`afterTextChanged`方法会被调用,从而获取到最新的搜索关键字。 2. **延迟自动搜索**: 延迟自动搜索是一种常见的优化策略,避免...
这就是如何在Android中根据EditText搜索框动态显示ListView数据的基本步骤。使用SimpleAdapter可以简化数据绑定,而TextWatcher则帮助我们监听并处理搜索事件。在实际应用中,你可能需要根据具体需求对数据结构和...
查询时,可以提供搜索框,输入关键词过滤联系人。修改时,可以选择一个联系人,跳转到新的Activity展示详细信息,并允许用户修改。提交更改后,更新SQLite数据库,并返回到主界面,显示更新后的列表。 最后,为了...
通过以上步骤,你可以实现Android页面上下滑动时搜索框颜色随滑动高度动态变化的效果。这个功能不仅可以增加界面的动态感,还能在视觉上引导用户注意搜索框,提高其使用率。在实际项目中,可以根据具体的设计风格和...
在Android开发中,实现“android联系人搜索框”是一项常见的需求,它允许用户通过输入关键词快速查找联系人信息。这个功能极大地提升了用户体验,使得在大量联系人数据中找到目标变得高效便捷。以下将详细介绍如何在...
本篇文章将详细讲解如何在Android中实现一个具有实时查询功能的搜索框,包括如何给EditText添加文本更改监听,以及如何在用户输入时使用模糊查询从数据库中检索数据并显示在ListView中。 首先,我们需要在布局文件...
在Android开发中,实现一个高效的搜索框功能是提高用户体验的关键因素之一。`PopupWindow`结合`ListView`可以创建一个弹出式搜索建议列表,让用户在输入关键字时能够快速浏览和选择相关条目。下面我们将详细探讨如何...
首先,我们需要了解Android中的搜索框组件。在Android SDK中,`EditText`组件通常被用来作为搜索框,它允许用户输入文本。为了实现搜索提示功能,我们可以监听`EditText`的`TextWatcher`事件,当用户在搜索框中输入...
综上所述,"浮Android项目动搜索框(SearchManager).rar"项目可能包含了以上所有步骤的实现,供开发者参考学习。通过深入研究这个示例项目,你可以更好地理解和掌握在Android应用中集成和自定义SearchManager的方法...