本节书摘来自异步社区《Android 平板电脑开发实战详解和典型案例》一书中的第2章,第2.1节搜索框控件—— SearchView,作者 吴亚峰 , 杜化美 , 索依娜,

2.1 搜索框控件—— SearchView
Android 平板电脑开发实战详解和典型案例
本节将介绍Android 3.0新增控件——搜索框控件SearchView,主要内容包括搜索框控件SearchView的基本知识以及一个简单的案例。

提示

本书中的案例都是在540×960分辨率的真机上调试通过的,若执行本书中案例的设备分辨率不是540×960,可能会有显示不正常的情况。但大部分案例都是没有问题的,尤其是最后第14、第15、第16章的大案例都是自适应于各种屏幕分辨率的。

2.1.1 搜索框控件基本知识
搜索框控件SearchView可增加一个ListView实现自动补全功能,通过Adapter给此控件加入自动补全列表,可根据输入的字段进行搜索。搜索框控件SearchView继承自LinearLayout,其继承树如图2-1所示。

说明

对于搜索框控件SearchView中的一些方法,由于篇幅所限,这里将不再一一赘述,请读者自行查阅相关的API。




android 开发 平板 pad launcher demo下载 android pad应用开发_搜索



2.1.2 搜索框控件使用案例
通过前面的介绍,读者对搜索框控件SearchView已经有了一个基本的了解,下面将通过一个简单的案例Sample2_1使读者进一步掌握搜索框控件SearchView的使用。在正式介绍此案例的开发步骤之前,请读者了解一下此案例的运行效果,如图2-2、图2-3和图2-4所示。


android 开发 平板 pad launcher demo下载 android pad应用开发_控件_02



图2-2为运行效果图,图2-3和图2-4分别为程序运行的初始界面输入“j”和“a”字母后的运行效果图。
了解了案例的运行效果之后,下面开始介绍案例的开发,具体步骤如下。

(1)首先需要编写的是界面布局文件searchview_layout.xml,其代码如下。

1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3     android:layout_width="match_parent"           <!--匹配父控件-->
4     android:layout_height="match_parent"           <!--匹配父控件--> 
5     android:orientation="vertical">              <!--垂直排序-->
6   <SearchView
7       android:id="@+id/search_view"             <!--设置id-->  
8       android:layout_width="wrap_content"          <!--自身决定宽度-->
9       android:layout_height="wrap_content"/>        <!--自身决定高度-->
10   <ListView
11       android:id="@+id/list_view"              <!--设置id-->
12       android:layout_width="match_parent"          <!--匹配父控件--> 
13       android:layout_height="match_parent"         <!--匹配父控件-->
14       android:layout_weight="1"/>          
15 </LinearLayout>

界面的布局比较简单,在主的LinearLayout中加入一个SearchView和一个ListView,并设置好相关的属性。
(2)完成了布局文件searchview_layout.xml文件的开发后,下面将要开发的是本案例中主Activity对应的类SearchViewActivity,其代码如下。

1 package com.bn.sample2_1;                        //声明包
2  ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class SearchViewActivity extends Activity implements SearchView.OnQueryTextListener 
4 { private SearchView mSearchView; 
5 private ListView mListView;
6 private final String[] mStrings = {"Java程序员职场全攻略",    //所要搜索的所有数据
7 "Java SE 6.0编程指南","30天学通Java Web项目案例开发","30天学通Java项目案例开发",
8  "Android核心技术与实例详解","Android 2.0游戏开发实战宝典"};
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 getWindow().requestFeature(Window.FEATURE_ACTION_BAR);    //设置窗口特性
13  setTheme(R.style.mytheme1)                   //设置主题
14 setContentView(R.layout.searchview_layout);           //设置当前界面
15 mListView = (ListView) findViewById(R.id.list_view);     //拿到列表视图对象
16 mListView.setAdapter(new ArrayAdapter<String>(
17 this,android.R.layout.simple_list_item_1,mStrings));     //添加适配器
18 mListView.setTextFilterEnabled(true);               //设置文本过滤器为可用
19 mSearchView = (SearchView) findViewById(R.id.search_view);  //拿到搜索框控件对象
20 mSearchView.setIconifiedByDefault(false);             //搜索栏是否默认被图标化
21 mSearchView.setOnQueryTextListener(this);             //添加监听器
22 mSearchView.setSubmitButtonEnabled(true);           //用于显示一个执行搜索功能的按钮 
23 mSearchView.setQueryHint(getString(R.string.search));}     //控件默认显示的文本
24 public boolean onQueryTextChange(String newText) {       //监听输入事件,内容有变化时调用
25 if (TextUtils.isEmpty(newText)) {                   //如果字符串为空
26  mListView.clearTextFilter();                     //去掉文本过滤器
27   } else {mListView.setFilterText(newText.toString());     //过滤所有内容
28    } return true;}
29 public boolean onQueryTextSubmit(String query) {          //监听回车或搜索按钮事件
30  Toast.makeText(this, getString(R.string.search_click)+ "  " + query, 0).show ();                                            //提示信息
31  return false; }}

第6~8行创建了要搜索的所有数据。第13~15行设置了主题和界面布局并拿到了ListView对象。
第16~18行为给ListView添加适配器并设置相关属性,第19~23行表示拿到SearchView对象,给其添加适配器并设置相关属性。
第24~28行重写了SearchView的监听器的onQueryTextChange方法,每当内容有变化时此方法被调用。
第29~31行重写了SearchView的监听器的onQueryTextSubmit方法来监听输入事件,当内容有变化时此方法被调用。