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

来源:互联网 发布:问道逍遥端怎么改数据 编辑:程序博客网 时间:2024/05/16 04:46

原文连接: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 ):

 @Overridepublic 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:

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


0 0
原创粉丝点击