现在的位置: 首页 > 综合 > 正文

Android Search概述

2018年06月10日 ⁄ 综合 ⁄ 共 3088字 ⁄ 字号 评论关闭

android有两种search模式search dialogsearch widget。下面就这两种模式和这两种模式的自定义的样式讲解。

 

1.Search Dialog

Dialog就是对话框的意思。这种模型呈现的方式就是在屏幕顶端弹出一个输入框,他和dialog一样,点击屏幕以及按返回键这个search控件会消失,新版微信主界面的搜索功能就是一个search dialog。实现一个search dialog需要以下几个步骤:

A.res/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>

创建一个searchActivity,并在主文件进行如下配置

    

<intent-filter>
       <action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
          android:resource="@xml/searchable"/>

D.创建内容提供者保持查询历史

穿件一个继承自SearchRecentSuggestionsProvider的内容提供者,并在searchable中声明android:searchSuggestAuthority

E.调用search

使用onSearchRequested()方法会发起一个打开searchActivityintent,为了不创建更多的searchActivity我们要把searchActivityandroid:launchMode设置为"singleTop"

这句话声明searchActivity如果位于activity栈顶就不会创建新的activity。于是我们在searchActivity中重载onNewIntent方法,当一个新的Intent发送到该activity并不创建新的Activity时会调用此方法。再于是我们在onCreateonNewIntent方法中都进行一个这样的判断intent.getAction().equals(Intent.ACTION_SEARCH)确定这个intent的活动是否是搜索,再通过 intent.getStringExtra(SearchManager.QUERY)得到搜索的关键字。

F:若其他activity想共用次搜索功能可以设置

<meta-data android:name="android.app.default_searchable"
           android:value=".SearchableActivity" />

以上是官方建议的一个设计模式,其实我们也可以这样设计:把searchActivity作为一个仅仅作为搜索功能的activity使用,即把android:launchMode="singleTop"去掉,并在application元素中注册

<meta-data android:name="android.app.default_searchable"
           android:value=".SearchableActivity" />

这样当所有activity调用onSearchRequested方法时都会启动searchActivity并执行搜索

通过search dialog实现我们可以发现search dialog其实就是构建一个Activity以供搜索,其实现步骤也是相对繁琐的。但是他有一个优点,可以把整个app的搜索都提交给这个activity解决。

 

2.Search Weiget

Weiget是器具的意思,可以确定这个模型就是一个控件。Android提供了一个SearchView控件,但是他只能在3.0版本上使用若想在低版本使用可以用v4兼容包下的SearchViewCompat类。若想在actionbar上添加搜索功能,可以在菜单配置文件中添加android:actionViewClass="android.widget.SearchView"。该控件可以添加SearchView.OnQueryTextListener监听器来监听输入及提交的关键字。由于控件的实现比较简单,此处不再贴代码,具体实现读者可以参考demo

 

3.自定义搜索控件

在现实中很多搜索功能都是自定义实现的,受苹果风格的影响国内很多搜索都是跳到一个只有输入框的单独的页面,这种方式操作繁琐是很不值得提倡的。如果开发者希望把搜索都提交到一个activity处理我认为有一种思路是值得借鉴的,就是把这个activity设置为窗口模式,并居于屏幕最顶端,就如模仿search dialog一样。为什么要这样做呢?因为这样可以使搜索的输入框和弹出的软键盘中留有更多的空隙,多留点空隙有两个好处1.可以显示更多的搜索建议,2.使得点击窗体外部关闭当前界面这个功能有更多的用武之地。这样的设计使得搜索界面和主界面可以来回迅速切换,就像是没有离开过主界面一样。如果还想更好的模仿search dialog可以在输入框旁边添加一个返回按钮。为什么建议添加这样一个按钮呢?在搜索界面软键盘会弹出,在屏幕较小的情况下屏幕的空白区域会比较小,这样使得点击窗体外部关闭当前界面这个不好使,这时用户希望按返回键返回主界面,但是由于软键盘弹出你需要按两下返回键才能回到主界面,如果我们添加一个返回按钮,用户只需按一下就能回到主界面,无疑谷歌如此细心的设计是值得我们学习的。

 

喜欢下载国外app的朋友会发现他们的很多app搜索控件在actionbar上显示,点击搜索按钮可以伸展开来并有一个Up button ,当按返回键或按下Up button 时这个控件又会关闭起来。这个控件就像是search dialogsearch weiget的结合体,兼具两者的优点。那么这个效果又是如何实现的呢?

设置菜单文件,添加android:actionLayout=="@layout/custom_search_view"android:showAsAction="collapseActionView|always",至于这个custom_search_view只要添加一个editText控件并设置android:imeOptions="actionSearch"便可。

menuItem.getActionView().findViewById(R.id.editText1),取得text控件,并用setOnEditorActionListener放假添加OnEditorActionListener监听器来取得其提交的值。

menu设置OnActionExpandListener监听器,该监听器要实现两个方法onMenuItemActionExpandonMenuItemActionCollapse。这两个方法分别是视图扩展和关闭方法。

 

 以上实例都有demo实现:http://download.csdn.net/detail/flypu/7001583

 

抱歉!评论已关闭.