注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Searchable(二)  

2011-05-10 14:43:07|  分类: 开发专题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
四、创建Searchable Activity
searchable activity根据搜索关键字进行搜索,并显示搜索结果。
当我们在search dialog or widget执行搜索的时候,系统就启动你的searchable activity ,并把搜索关键字用一个aciton为ACTION_SEARCH的Intent传给你的searchable activity. 你的searchable activity在Intent中通过extra的QUERY来提取搜索关键字,执行搜索并显示搜索结果.
我们需要在AndroidManifest.xml文件中声明Searchable Activity,以便在search dialog or widget执行搜索的时候,系统启动该searchable activity并把搜索关键字传给它。
4.1、声明searchable activity
如何在AndroidManifest.xml文件中声明Searchable Activity
   1. 在activity的<intent-filter> 中添加一个可以接受action为ACTION_SEARCH的intent。
   2. 在<meta-data>中指明search dialog or widget的配置文件(即searchable.xml)
   比如,示例2
   <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>
<meta-data>必须包括android:name这个属性,而且其值必须为"android.app.searchable"
还必须包括android:resource这个属性,它指定了我们的search dialog配置文件。(示例2中指定是the res/xml/searchable.xml).
注意: <intent-filter> 没有必要加入<category android:name="android.intent.category.DEFAULT" /> ,
因为系统是通component name把ACTION_SEARCH intent explicitly显示的传递给searchable activity的
4.2、执行搜索
当你在manifest文件中,声明好了searchable activity,在你的searchable activity,就可以参照下面的3步执行搜索了。
(1)提取搜索关键字
(2)在你的数据中进行搜索
(3)显示搜索结果
一般来说,你的搜索结果需要要在ListView进行显示,所有你的searchable activity需要继承ListActivity。
它包括了一个拥有单一ListView的layout,它为我们使用ListView提供了方便。
4.2.1、提取搜索关键字
当用户在search dialog or widget界面开始搜索的时候,系统将查找一个合适的searchable activity,并给它传送一个ACTION_SEARCH的intent,该intent把搜索关键字保存在extra的QUERY中。当activity的时候,我们必须检查保存在extra的QUERY中的搜索关键字,并提取它。
比如,示例3:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action and get the query
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}
在Action为ACTION_SEARCH的intent中,extra的QUERY总是被包含。在示例3提取处理了搜索关键字,然后让doMySearch()函数在执行真正的搜索的。
4.2.2、数据搜索
数据的存储和搜索都是和你的程序相关的。你可以以各种方式进行数据的存储和搜索,它才是你的程序更需要关注的。 
但是还是有几点需要注意的:
(1)当你的数据存储在手机的数据库中时,执行full-text search (using FTS3, rather than a LIKE query)
能提供在文本数据中得到更健壮且速度更快的search。在 sqlite.org 中可以得到FTS3的更多信息, 在 SQLiteDatabase 可以看到Android上的SQLite更多信息 . 可以在 Searchable Dictionary看到一个用FTS3实现搜索的示例。
(2)如果的数据来自互联网,那么你的搜索将受制于用户的数据连接情况。这时我们就需要显示一个进度条,直到从网路返回搜索结果。
. 在 android.net 可一看到更多的network APIs ,在 Creating a Progress Dialog 可以到看到如何显示一个进度条。
如果想让的数据和搜索变得透明,那么我建议你用一个Adapter返回搜索结果。这种方式,你更容易在ListView中显示搜索结果。如果你的数据在自于数据库,那么通过CursorAdapter向ListView提供搜索结果,如果你的数据来自于其他方式,可以扩展一个BaseAdapter来使用。
4.2.3、结果显示
正如上面讨论的一样,显示搜索结果建议使用的UI是ListView,所以你的searchable activity最好继承于ListActivity,然后是使用setListAdapter()来设置和搜索结果绑定了的Adapter。这样你的搜索结果就可以显示在ListView中了。
你可以参考 Searchable Dictionary 示例,它展示了怎么进行数据库查询,怎么使用Adapter向ListView提供搜索结果。
  评论这张
 
阅读(1484)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017