转载请标明出处:
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;
}
至此,你的应用便已具有搜索功能了,为了让你的搜索更加智能,你还可以为搜索添加最近查询推荐和自定义查询推荐功能。