本节书摘来自异步社区《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。
2.1.2 搜索框控件使用案例
通过前面的介绍,读者对搜索框控件SearchView已经有了一个基本的了解,下面将通过一个简单的案例Sample2_1使读者进一步掌握搜索框控件SearchView的使用。在正式介绍此案例的开发步骤之前,请读者了解一下此案例的运行效果,如图2-2、图2-3和图2-4所示。
图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方法来监听输入事件,当内容有变化时此方法被调用。