Setting Up the Search Interface(设置搜索接口)

原文连接:http://docs.eoeandroid.com/training/search/setup.html

译者:长剑耿介

完成日期:2012年8月28日

设置搜索界面

从Android3.0开始,使用SearchView部件作为工具栏中的搜索部件,是您的应用程序的首选方式。 和工具栏中的所有项目一样,只要有有空间,你可以定义SearchView显示在任何时候,或作为一个可折叠的活动,显示为一个图标,当用户点击它时,最初的SearchView 将占据整个工具栏用来搜索字段。

注:在这个类中,您将学习如何使您的不支持SearchView应用程序向下兼容的设备到Android 2.1(API 7级) 。

向工具栏添加搜索视图

要向工具栏添加一个的SearchView部件,可以在您的项目种创建一个名为res/menu/options_menu.xml文件,并添加下面的代码到该文件。 此代码定义了如何创建搜索项目,比如该项目要使用的图标和标题。 collapseActionView的属性可以让你的SearchView扩展到了整个工具栏,在不使用时又可以折叠回一个正常的工具栏项目。 由于手持设备的工具栏空间有限,建议您使用collapsibleActionView属性来获得更好的用户体验。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/search"
          android:title="@string/search_title"
          android:icon="@drawable/ic_search"
          android:showAsAction="collapseActionView|ifRoom"
          android:actionViewClass="android.widget.SearchView" />
</menu>

注:如果你已经有一个XML文件菜单项,你可以向该文件中添加<item>元素替代。

要在工具栏显示SearchView ,可以在活动的onCreateOptionsMenu()方法中扩展XML菜单资源( res/menu/options_menu.xml ):

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
 
    return true;
}

如果你现在运行你的应用程序, SearchView 会出现在您应用程序的工具栏,但还不能操作。 现在,您需要定义 SearchView 的行为了。

创建可检索的配置

Searchable Configuration定义了SearchView的行为,并且在res/xml/searchable.xml中被定义。 一个Searchable Configuration至少包含一个android:label,其属性要和你的 Android manifest(Android清单)中<application><activity>元素的android:label属性具有相同的值。 另外,我们也建议增加一个android:hint属性来提示用户在搜索框中输入什么内容:

<?xml version="1.0" encoding="utf-8"?>
 
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

在您的应用程序的manifest文件,声明一个的 <meta-data> 元素指向res/xml/searchable.xml文件,使您的应用程序知道在哪里可以找到它。 在<activity>中声明要显示在 SearchView 中的元素 :

<activity ... >
    ...
    <meta-data android:name="android.app.searchable"
            android:resource="@xml/searchable" />
 
</activity>

在您之前创建的onCreateOptionsMenu()方法中,通过调用setSearchableInfo(SearchableInfo)方法来关联搜索配置(the searchable configuration )和SearchView

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
 
    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
           (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));
 
    return true;
}

通过调用 getSearchableInfo() 方法可从已创建的可搜索的XML配置文件( the searchable configuration XML file)中获得 SearchableInfo 对象。 当可搜索的配置( the searchable configuration)正确地与你的 SearchView  相关联时,用户提交一个搜索查询后, SearchView 可以通过 ACTION_SEARCH 意图(intent) 启动一个活动(activity)。现在,你需要一个可以筛选(filter)这个意图(intent)和处理搜索查询的活动。

创建一个可检索的活动

用户提交一个搜索查询后,SearchView会尝试通过ACTION_SEARCH来启动一个活动(activity)。 一个可搜索的活动可以筛选ACTION_SEARCH意图(intent)和在某种数据集中查询搜索。 要创建一个可搜索的活动,需要为这个活动声明过滤的ACTION_SEARCH意图(intent):

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

在您的可搜索活动中,通过在 onCreate() 方法中检查 ACTION_SEARCH 意图 来处理它。

注:如果您的可搜索活动以单顶模式(android:launchMode="singleTop")启动的话, 也可以在onNewIntent()方法中处理ACTION_SEARCH意图。 在单顶模式下,您的活动只有一个实例被创建,随后被调用来启动你的活动而不在栈上创建一个新的活动。 这种启动模式是非常有用的,用户可以从相同的活动执行搜索,而无需每次都创建一个新的活动。

public class SearchResultsActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        handleIntent(getIntent());
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        ...
        handleIntent(intent);
    }
 
    private void handleIntent(Intent intent) {
 
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search your data somehow
        }
    }
    ...
}
如果你现在运行你的应用程序, SearchView 可以接受用户的查询,并通过 ACTION_SEARCH 意图启动搜索活动。 现在由你来弄清楚如何存储和检索查询到得数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值