Android 的搜索机制 I-创建一个搜索框

本文介绍了Android中的搜索机制,包括创建搜索接口的两种方式:搜索框和SearchDialog,以及如何创建searchable configuration和SearchableActivity。重点讨论了保护用户隐私的注意事项,如不发送个人信息、提供删除搜索记录的选项。此外,还涵盖了Search Widget的配置和使用,以及如何处理搜索操作和显示搜索结果。文章最后提到了在不同场景下选择SearchDialog或Search Widget的考量因素。
摘要由CSDN通过智能技术生成

概述:

搜索是Android为用户提供的核心功能之一. 用户应该可以搜索任何对他们有用的数据, 不管该内容是在本地的还是在网络上的. 为了向用户提供统一风格的搜索体验, Android提供了一个search framework, 可以帮助我们为APP实现搜索功能. 下图是可以给用户提供搜索建议的搜索框快照:


Search framework为我们提供了两种可以用于搜索的方法: 一种是在屏幕顶端的搜索框, 还有就是使用可以嵌入activity layout的SearchView. 我们还可以为搜索框提供搜索建议, 就好像上图显示的那样. Android会为我们的搜索框提供一些辅助功能, 不管使用哪种方式, 我们都可以:

Ø  可以使用声音搜索.

Ø  根据用户最近搜索提供搜索建议.

Ø  根据APP中的特定数据提供搜索建议.

Ø  在Android的全系统搜索框中提供APP的搜索建议.

Search framework并不提供搜索我们的数据的API.想要处理搜索的话, 我们需要对自己的数据提供相应的API. 比如, 如果我们的数据存放在SQLite中, 我们应该使用android.database.sqlite的API来处理搜索. 此外也不能保证一个设备提供一个专门的搜索按钮用于我们的APP的搜索界面. 当使用搜索框或者自定义接口的时候我们必须提供一个自己UI内部的搜索接口.

关于保护用户的隐私:

在实现搜索功能的时候我们应该考虑到用户的隐私, 至少应该考虑到这些:

1.      不要发送用户的个人信息到服务器, 如果必须这样的话, 不要记录它.

个人信息是可以用于识别用户的任何信息, 比如名字, email地址, 账单信息, 或者其他可以连接到这些信息的信息. 如果我们的APP需要服务器的协助完成搜索功能, 请避免搜索信息和个人信息捆绑一起发送. 比如: 如果你需要搜索某个邮政区号内的商家, 我们不应该发送用户ID, 只要发送邮政区号即可. 如果我们必须发送个人信息, 那么不应该记录这些信息. 如果必须记录这些信息, 那么应该非常细心的保护它们, 并且应该尽快删除.

2.      为用户提供删除搜索记录的方法.

Search framework在用户输入的时候帮我们的APP提供了针对具体内容的建议.有时候这些建议是基于之前的搜索或者用户之前的操作的. 用户或许不希望自己的搜索记录被该设备的其他用户知道(比如一起分享设备的朋友家人等). 如果我们的APP有可以根据搜索历史提供的搜索建议, 那么我们应该提供给用户删除之前搜索记录的功能. 如果我们使用的是SearchRecentSuggestions, 那么我们可以直接调用clearHistory()方法来删除这些记录. 如果我们自己实现了自定义的搜索建议, 我们需要提供类似”清除搜索数据”的功能.

创建一个搜索接口:

当我们打算向APP中添加搜索功能的时候, Android会帮助我们实现用户接口, 它提供了两种方式, 一种是出现在activity页面顶部的”search dialog”, 还有一种是可以嵌入在我们的layout中的”search widget”. 这两种方式都可以放在我们APP的任何activity中. 用户可以从任何可以启动”search dialog”和”search widget”的activity中初始化搜索操作, Android会启动合适的activity来处理搜索并显示结果. 其它的搜索功能可以支持的特性有:

声音搜索; 根据最近搜索提供搜索建议; 根据APP内的数据提供搜索建议. 下面将做详细介绍.

基础:

在开始实现搜索功能之前我们首先应该确定自己使用”search dialog”还是使用”search widget”. 它俩都可以实现搜索功能, 但是实现稍微有所区别:

Searchdialog是由Android控制的UI组件, 当被用户激活的时候, 它就会显示出来, 效果如下图. Android将会控制其所有的事件, 当用户提交一个查询的时候, Android会将该查询提交给我们指定的处理搜索的activity. 这个dialog还可以处理搜索建议. 


Search widget则是一个我们可以放在layout中任何位置的SearchView实例. 默认情况下这个控件的行为就像一个标准的EditText控件, 在那里默默的待着. 但是我们可以对其进行配置让Android处理它所有的输入事件, 将查询交付给合适的activity, 然后像search dialog一样提供搜索建议. 但是Search widget只能使用在Android3.0及以上版本中. 如果有必要的话我们可以通过各种监听器处理所有的用户输入事件, 但是在这里我们只聚焦于借助Android提供的帮助来实现搜索功能.

当用户通过search dialog或者search widget来实施搜索操作的时候, Android将会创建一个intent并且将用户的查询保存在里面. 然后启动一个我们指定的activity来处理搜索(这个activity叫”searchable activity”)并将intent传递给它. 要实现这一流程我们必须这样做:

1.      Searchable configuration: 一个为searchdialog或者search widget配置一些设置的XML文件. 包括一些设置项, 比如语音搜索, 搜索建议, 和搜索框的提示文本等.

2.      Searchable activity: 用于接收搜索查询的Activity,用于搜索数据和显示搜索结果.

3.      Searchable interface: 由searchdialog或者SearchView提供. 默认情况下Search dialog是隐藏的, 当我们调用onSearchRequested()方法的时候(当用户点击搜索按钮的时候)显示在屏幕顶端. 而使用searchView可以让我们将搜索框放在activity的任何位置, 但是我们应该将它放在app bar中作为一个action view来处理.

剩下的部分将会对上述三个步骤进行详细介绍.

创建一个searchableconfiguration:

首先需要的是一个叫做”searchable configuration”的XML文件. 它对搜索功能进行了一些配置,比如搜索建议和语音搜索的行为等. 该文件一般命名为searchable.xml, 并且必须位于res/xml/目录下. Android使用该文件来实例化一个SearchableInfo对象, 但是我们不能再运行时手动创建该对象, 必须声明searchable configuration文件来由Android生成它.

下面来介绍该文件的规则, 这个文件必须有一个<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是唯一必须的属性, 它指向一个string资源, 这个string资源应该是APP的名字. 在我们使Quick Search Box可用之前, 这个label是不会被用户看到的, 设置为可用之后, 用户将会在系统设置中的Searchable条目中看到这个值.

虽然android:hint不是必须的, 但是官方还是建议我们实现这个属性, 该属性会让用户在输入之前就看到搜索框中的提示文本. 这东西很重要, 因为它可以提示用户他们可以在这里做什么样的搜索. 为了保证Android下搜索操作的一致性, 我们应该为android:hint指定统一的格式”Search <content-or-product>”, 比如”Search songs andartists”或者”Search YouTube”.

<searchable>标签还有其它的属性, 然而如果不使用搜索建议或者语音搜索的话用不到它们, 更多信息将在后文介绍.

创建一个SearchableActivity:

Searchable Activity是APP中用来根据查询字符串处理搜索和展示搜索结果的Activity. 当用户在search dialog或者search widget中执行一次搜索操作的时候, Android会启动我们的Searchable Activity, 并传给它一个带有ACTION_SEARCH的Intent. 然后Searchable Activity可以从intent中名为QUERY的extra中获取到查询的内容, 然后就可以搜索数据并显示结果了. 但是在此之前Android必须知道哪个Activity是用来做Searchable Activity的, 我们应该在manifest文件中声明它.

声明一个SearchableActivity:

目前我们首先需要一个处理搜索和显示结果的Activity, 还不需要实现真正的搜索功能, 只在manifest中声明一个Activity即可, 在这个<activity>中, 我们需要:

1.      通过<intent-filter>声明Activity可以接受action为ACTION_SEARCH的intent.

2.      通过<meta-data>指定要使用哪个searchable configuration.

栗子:

<application ... >
    <activity android:name=".SearchableActivity">
        <intent-filter>
            <action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值