搜索

来源:互联网 发布:小满软件 编辑:程序博客网 时间:2024/04/30 03:01

1.Android系统提供了两种搜索的输入方式:搜索对话框和搜索插件(SearchView)。如下面两种:

         

                             搜索对话框                

 

                               搜索插件

在两种方式下都可以进行以下操作:

  • 启用语音搜索;
  • 根据用户最近的查询来提供搜索建议;
  • 提供符合实际应用数据的搜索建议;
  • 提供系统快速搜索栏级别的搜索建议;
下面从四个方面来实现搜索:
  1. 创建搜索界面;
  2. 增加最近查询建议;
  3. 增加定制的建议;
  4. 搜索配置;
=======================================================================================================================
2.创建搜索界面:
系统会将用户的查询传递给一个指定的activity来进行搜索操作并显示结果。
在开始前,应先决定是使用搜索对话框还是搜索插件。两者都提供相同的搜索功能,但是有些略微的不同:
1>搜索对话框:是由系统控制的一个UI组件,当被用户激活时,搜索对话框会出现在activity的顶部。系统控制着它的所有活动。当用户提交了一个查询,系统会将查询传递给指定用来处理搜索的activity。对话框也可以在用户输入的时候提供搜索建议;
2>搜索插件:是一个 SearchView 的实例。你可以把它放在布局中的任意位置。默认的,搜索插件就像一个EidtText并且不做任何事情,但可以通过配置似的系统可以处理所有的事件。然而,搜索插件只有才3.0以上版本才可用。
当用户执行了一个搜索操作,系统会创建一个Intent并把用户的查询储存在其中。然后系统再启动用来处理查询的activity并将这个intent传递给它。要建立起搜索,必须实现下列步骤:
  • 一个供搜索的配置:一个为搜索框或者搜索控件配置了某些设置的XML文件。包括一些功能的设置,如语音搜索,搜索建议,提示文本和搜索盒;
  • 一个供搜索的activity:接受搜索查询的activity,搜索数据并显示结果;
  • 搜索界面:可以是搜索对话框或者搜索控件;
1.创建搜索配置:
首先需要创建一个searchable.xml的文件,并且必须放在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>
android:label属性是为一个必须的。它指向应用的名称。这个标签实际上是不可见的,知道你启动了快速搜索建议。这时,这个标签就在系统设置里的搜索项目列表中可见了。
为保持Android系统应用的一致性,建议使用"搜索 <内容 或 产品>"的格式。如:“搜索歌曲”;
2.创建搜索Activity:
当用户搜索的时候,系统会启动你的搜索Activity并传递一个还有ACTION_SEARCH的Intent。改activity从这个intent的QUERY exrta中获取查询信息,搜索数据并显示出来。
要让一个Activity成为一个供搜索的Activity,需要在manifest文件中进行申明。包括含有 ACTION_SEARCH的<intent-filter> 元素,和一个 <meta-data>元素,而且必须包含android:name="android.app.searchable"和android:resource="@xml/searchable"。后者是刚才创建的xml文件。如:
<application ... >    <activity android:name=".SearchableActivity" >        <intent-filter>            <action android:name="android.intent.action.SEARCH" />        </intent-filter>        <meta-data android:name="android.app.searchable"                   android:resource="@xml/searchable"/>    </activity>    ...</application>

执行一次搜索:分为3步:
  1. 接受查询;
  2. 搜索数据;
  3. 呈现结果;
(通常来说,查询结果应该被显示在一个ListView中,所以你可以继承ListActivity,方便构造列表;)

1.接受查询:当用户执行操作时系统会传递一个ACTION_SEARCH Intent,这个Intent在QUERY字符串extra中携带着搜索查询。在这个activity启动时,你必须检查这个intent并把该字符串解压出来。如:
@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.search);    // 获取intent。并验证action,获得查询的字符串。    Intent intent = getIntent();    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {      String query = intent.getStringExtra(SearchManager.QUERY);      doMySearch(query);    }}

2.搜索数据:储存和搜索数据的方式是因应用而异的。可以是数据库或者网络方式。但是不管用什么方式,建议用Adapter来返回结果。通过这个方式,你可以方便地在一个ListView中展示搜索结果。如果数据来自SQLite数据库,使用CursorAdapter。弱国是其他格式,可以创建BaseAdapter的继承类;
3.表达结果:像上边建议的一样,推荐的表达结果的方式是ListView,所以你可以使你的activity继承ListActivity。你调用setListAdapter(),传入一个捆绑了数据的Adapter。

3.使用Search Dialog

search dialog提供了一个上浮在屏幕上方的搜索条,应用程序的图标显示在搜索条的左边。当用户在输入的时候,它可以提供建议的搜索关键字。当用户自行搜索的时候,系统会把它的搜索关键字searchable activity来执行真正的搜索。

但是如果你的设备使用的是Android 3.0,(或更高版本),你可以考虑使用search widget。

search dialog默认是隐藏的,直到用户激活它。如果用户的手机上有SEARCH按钮,那么按下该键,默认是激活search dialog。

为了使用search dialog,你必须向系统说明哪个searchable activity将受到该search dialog的搜索请求,以便执行搜索。比如,在示例2中,是叫SearchableActivity的searchable activity,当然同时使用search dialog的也是它。如果你想使用其他的actvitity来显示search dialog的, 比如名字为OtherActivity, 让它来显示search dialog 并把搜索请求传递给SearchableActivity, 你必须在manifest中声明一个searchable activity

(比如SearchableActivity)来接收OtherActivity中的search dialog的搜索请求.

为一个activity的search dialog声明searchable activity,你需要在AndroidManifest.xml中代表该activity的<activity> 元素中加入<meta-data>。

这个<meta-data>必须包含“android:value”属性,该属性指明了searchable activity的类名,

还必须包括属性“android:name”,且其值必须为 "android.app.default_searchable".

下面的例子就声明了两个searchable activity(SearchableActivity和OtherActivity),

OtherActivity也是在它的search dialog中使用SearchableActivity执行searches操作。

示例4:

<application... ><!-- this is the searchable activity; it performs searches --><activity android:name=".SearchableActivity" ><intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-data android:name="android.app.searchable"android:resource="@xml/searchable"/></activity><!-- this activity enables the search dialog to initiate searchesin the SearchableActivity --><activity android:name=".OtherActivity" ... ><!-- enable the search dialog to send searches to SearchableActivity --><meta-data android:name="android.app.default_searchable"android:value=".SearchableActivity" /></activity>...</application>


因为在OtherActivity 中已经包含了一个 <meta-data>元素,它声明了使用哪个searchable activity来执行搜索,所以它的search dialog也变得可用。按下手机的SEARCH按钮(如果有的话)或调用onSearchRequested()都将激活search dialog.

一旦用户在search dialog中执行search操作, 系统将启动SearchableActivity 并向其传送ACTION_SEARCH intent.

提示:searchable activity 自己默认就提供了the search dialog ,且它的searchable activity就是自己本身,所以不需要再声明.

如果你想为你的应用程序的每个activity 都提供该search dialog, 那么请 <meta-data> 元素加入 <application> 作为其儿子, 而不是加入到每个<activity>. 通过这种方式, 每个activity 都继承了该值, 提供search dialog, 并把searches传送到同一个searchable activity. (如果你有多个searchable activities, 你可以在单个activitiy中加入不同的<meta-data>来声明searchable activity,这样就重写了默认的searchable activity )

如何启动search dialog:

正如上面所提到的,如果当前activity声明了使用searchable activity,那么按下手机的SEARCH按钮(如果有的话)或调用onSearchRequested()都将激活search dialog.

然而,SEARCH按钮并不是所有的设备上都有,所以你需要在你的UI中提供一个搜索按钮,

以便通过调用onSearchRequested()激活search dialog 。

例如,你可以在Options Menu的一个菜单项或在你的activity的布局的按钮中调用onSearchRequested()来启动search dialog.

search_icons.zip 文件中有针对medium and high density屏幕的搜索图标,你可以在你的搜索菜单项或按钮中使用它(low-density screens scale-down the hdpi image by one half).

你也可以使用"type-to-search"功能, 这样当用户在键盘进行输入的时候,将激活search dialog,并且是直接输入到search dialog.

你可以在activity的onCreate() 中调用setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL)来开启该功能


搜索对话框对activity生命周期的影响:

搜索对话框是一个浮在窗口顶部的对话框。它不会引起activity栈的任何变化。没有生命周期相关的方法会被调用。仅仅是失去焦点而已。如果想要在搜索对话框被激活时被提醒,那就重写onSerachRequested()方法。当系统调用这个发那个发时,它将是你焦点传递给搜索对话框的标志。你可以做任何合适的动作。除非你想传递搜索上下文数据,否则你就iyingg调用它父类的实现。如:

@Overridepublic boolean onSearchRequested() {    pauseSomeStuff();    return super.onSearchRequested();}

传递搜索上下文数据:

@Overridepublic boolean onSearchRequested() {     Bundle appData = new Bundle();     appData.putBoolean(SearchableActivity.JARGON, true);     startSearch(null, false, appData, false);     return true; }


3.搜索界面-搜索部件:在3.0及以上版本,推荐将搜索部件作为一个action view 插入Action Bar。

配置搜索部件:

在建立了搜索配置和搜索activity后,需要为每一个SearchView启动辅助搜索。你可以调用 setSearchableInfo() 并传入一个 SearchableInfo 对象。这个 SearchableInfo可以通过调用 SearchManager 的getSearchableInfo()方法得到。

比如,当你把一个SearchView当作一个Action Bar的action view来使用时,你可以在onCreateOptionsMenu()回调方法中这样做:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the options menu from XML    MenuInflater inflater = getMenuInflater();    inflater.inflate(R.menu.options_menu, menu);    // Get the SearchView and set the searchable configuration    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default    return true;}

其他的搜索控件功能:

  • 提交按钮:默认情况下,没有提交按钮,你可以调用setSubmitButtonEnabled(true) 来添加;
  • 当你使用search suggestions的时候, 你经常希望用户仅仅是简单选择suggestion, 但是他们也可能想自定义suggested search query. 你可以通过调用setQueryRefinementEnabled(true),来为每个suggestion添加一个按钮,让用户在search box中输入用户自定义的suggestion
  • 触发使搜索框可见:默认情况是下点击搜索按钮可见,可以调用setIconifiedByDefault(false)。























原创粉丝点击