为Android系统或你的应用提供搜索功能--开始使用搜索功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/reakingf/article/details/51956096

转载请标明出处:
http://blog.csdn.net/reakingf/article/details/51956096
本文出自:【方耿佳的博客

Creating a Search Interface

Creating a Searchable Configuration

在res/xml/中创建一个xml文件作为Searchable Configuration,用于配置搜索对话框或搜索小部件的设置,例如voice search, search suggestion, 和hint text等,通常命名为searchable.xml,如下所示:

<?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属性是唯一一个必须存在的属性,且它的值一般为你的Application name。这个属性只有你为Quick Search Box启动搜索提醒(search suggestions)才会出现在系统的Settings的可搜索项列表中被用户看到。

Creating a Searchable Activity

在Android manifest文件中申明该activity作为搜索用的activity,该activity用于接收search dialog 或 widget发送过来的搜索内容,并根据这些内容在你的数据中进行搜索最后将搜素结果显示给用户。
1. 声明
主要需要声明activity的action为“android.intent.action.SEARCH”,并在meta-data中提供该activity要使用到的支持搜索的配置信息(该meta-data的name对应的值必须是“android.app.searchable”,resource则是前面设置的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>

2. 执行搜索
主要包括下面三个步骤:

a. Receiving the query
当用户使用搜索对话框或搜索部件进行搜索时,系统会创建一个Intent对象并将用户查询内容存储到一个名为SearchManager.QUERY的StringExtra中,设置该Intent的action为ACTION_SEARCH,然后启动对应的search activity,并向其发送该Intent对象。故这个search activity的处理逻辑如下:

@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);//your local method where the actual search operation is done
    }
}

b. Searching your data
根据你自己的需求,设计该搜索内容的搜索对应的方法。

c. Presenting the results
将搜索结果显示给用户,官方建议将结果显示到ListView中,同时你可以让你搜索用的activity继承ListActivity,里面提供了一些比较方便的和ListView有关的方法。

3. 搜索接口
搜索用接口可以使用搜索对话框或搜索小部件。

1) 使用对话框
搜索对话框在屏幕的顶部提供了一个浮动的搜索布局,左边是你的application icon,默认该对话框是隐藏的,当用户激活该搜索功能(需要一个button或其他控件或视图执行onSearchRequested()方法)时才会出现在顶部。这个对话框可以提供用户输入内容搜索建议,如下图所示。
这里写图片描述
然而,在Android3.0以上建议使用小部件,详情后面给出。
如果想在一个activity中使用search dialog,但又想在另外的activity中执行搜索,则需要在原activity中添加一个mate-data元素,申明该activity为激活search dialog的activity,具体做法如下:

<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 searches in the SearchableActivity -->
    <activity android:name=".MainActivity" ... >
        <!-- enable the search dialog to send searches to SearchableActivity -->
        <meta-data android:name="android.app.default_searchable"
        android:value=".SearchableActivity" />
    </activity>
    ...
</application>

若你想让你的应用的所有activity都支持搜索功能,则可以将这一句

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

放置于<apllication>节点下,这样改应用的所有activity就都继承了该属性,都能够使用搜索对话框了,并且所有的搜索处理逻辑都交给同一个activity,即SearchableActivity。

2)搜索对话框在activity生命周期中的影响
搜索对话框不会对activity任务栈造成任何改变,当它被激活时,当前activity只是将焦点交给该dialog,不会调用onPouse()等生命周期方法。当用户按下返回键时,dialog关闭并将焦点还给activity。如果你想在dialog关闭时处理一些事,如提醒,可以使用 setOnDismissListener() 或 setOnCancelListener()方法为dialog注册监听器。
但是,当用户执行搜索时,如果当前activity不是SearchableActivity,则会引起生命周期的变化(即启动一个新的activity–SearchableActivity)。同时,官方建议将SearchableActivity设置为SingleTop模式,避免创建多个SearchableActivity实例,此时还需在onNewIntent()中处理搜索内容,如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

2) 使用搜索小部件

小部件是SearchView的一个实例,可放置于布局中的任意位置,默认和EditText一样,不做任何功能处理。但你可以自己配置它的功能,达到让Android系统对它的输入事件进行处理、提供搜索建议并发送查询给相应Activity的功能(就像search dialog一样)。如果你希望将应用部署在Android3.0版本及以上,官方建议使用search widget而不是search dialog,并将小部件部署与app bar上而不是在activity layout中。为了使你的SearchView能够辅助搜索,需要调用setSearchableInfo()方法并传入代表应用可搜索的配置信息SearchableInfo对象,部署在app bar上的用法如下:

@Override
public 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();
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    return true;
}

至此,你的应用便已具有搜索功能了,为了让你的搜索更加智能,你还可以为搜索添加最近查询推荐和自定义查询推荐功能。

猜你喜欢

转载自blog.csdn.net/reakingf/article/details/51956096
今日推荐