原文连接: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
意图启动搜索活动。 现在由你来弄清楚如何存储和检索查询到得数据。