App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法、列表类视图及其适配器的用法、翻页类视图及其适配器的用法、碎片及其适配器的用法等。 另外介绍四大组件之一广播Broadcast的基本概念与常见用法。
一、日期时间控件
1.日期选择器DatePicker
日期控件有两种展现形式:
(1)日期选择器DatePicker,直接显示在界面上。
(2)日期选择对话框DatePickerDialog,以对话框形式展示。
日期选择器和日期对话框的显示效果
2.时间选择器TimePicker
日期选择器用来选择年月日,时间选择器用来选择时分秒。
时间控件也有两种展现形式:
(1)时间选择器TimePicker,直接显示在界面上。
(2)时间选择对话框TimePickerDialog,以对话框形式展示。 注意时间控件有区分十二小时制和二十四小时制。
时间选择器和时间对话框的效果图
二、列表类视图
1. 基本适配器BaseAdapter
从BaseAdapter派生的数据适配器主要实现下面3个方法。
构造函数:指定适配器需要处理的数据集合。
getCount:获取数据项的个数。
getView:获取每项的展示视图,并对每项的内部控件进行业务处理。
基本适配器的编码步骤
主要编码步骤如下:
(1)新建列表项的布局文件item_list.xml。
(2)写个新的适配器继承BaseAdapter,实现对列表项视图的获取与操作。
需要重写适配器的两个方法:
1)重写getCount方法,返回列表项的个数。
2)重写getView方法,根据item_list.xml里面的布局,返回指定位置的列表项的视图内容。
(3)在页面代码中构造这个基本适配器,并调用Spinner对象的setAdapter方法设置适配器。
使用基本适配器的行星列表效果
2. 列表视图ListView
列表视图ListView允许在页面上分行展示相似的数据界面,如新闻列表、商品列表、书籍列表等,方便用户逐行浏览与操作。
列表视图ListView新增的属性与方法
如何使用ListView:
ListView实现了3个与适配器相关的方法。
setAdapter:设置列表项的数据适配器,适配器一般继承BaseAdapter。
setOnItemClickListener:设置列表项的点击事件监听器。
setOnItemLongClickListener:设置列表项的长按事件监听器。
注意:如果列表项包含EditText、Button、ImageButton、CheckBox等控件,此时点击列表项不会响应点击监听器OnItemClickListener。
解决办法是给列表项布局的根节点加上descendantFocusability属性,并声明在列表项范围内剥夺子控件的抢占权利,示例如下: android:descendantFocusability="blocksDescendants"
如何显示列表视图的分隔线
采取列表视图的购物车页面
3. 网格视图GridView
网格视图GridView用于分行分列显示表格信息。
GridView新增的属性与方法
网格视图的拉伸模式取值
网格视图的拉伸模式效果
采取网格视图的商场频道页面
三、翻页类视图
1. 翻页视图ViewPager
ListView与GridView,一个分行展示,另一个分行又分列,其实都是在垂直方向上下滑动。
翻页视图ViewPager允许页面在水平方向左右滑动。一个页面就是一个页面项,许多页面组成ViewPager的所有页面项。
ViewPager新增的方法
翻页监听器
ViewPager通过addOnPageChangeListener方法设置翻页视图的页面切换监听器。该监听器需实现接口OnPageChangeListener下的3个方法,具体说明如下。
onPageScrollStateChanged(int arg0) :在页面滑动状态变化时触发。arg0取值说明为:0表示静止,1表示正在滑动,2表示滑动完毕。在翻页过程中,状态值变化依次为:正在滑动→滑动完毕→静止。
onPageScrolled(int arg0, float arg1, int arg2) :在页面滑动过程中触发。第一个参数表示当前页面的序号;第二个参数表示当前页面偏移的百分比,取值为0到1;第三个参数表示当前页面的偏移距离。
onPageSelected(int arg0) :在选中页面时,即滑动结束后触发。arg0表示当前滑到了哪一个页面。
翻页视图的展示效果
2. 翻页标题栏PagerTitleStrip/PagerTabStrip
Android提供了两个翻页标题栏控件,用于展示ViewPager的各页面标题。
(1) PagerTitleStrip,只是单纯的文本标题效果,无法点击进行页面切换。
(2) PagerTabStrip,类似选项卡效果,文本下面有横线,点击左右选项卡即可切换到对应页面。 要想在标题栏显示指定的文字,需要重写PagerAdapter的getPageTitle方法,在该方法中返回每个页面的标题文本。
翻页视图搭配翻页标题栏的布局文件
翻页视图搭配翻页标题栏的界面效果
3. 简单的启动引导页
用户安装一个新的App时,第一次启动大多出现欢迎页面,这个引导页通常要往右翻好几页,才会进入App的主页面。启动引导页的效果大多是ViewPager做的。
每个引导页都由两部分组成,一部分是背景图;另一部分是页面下方的一排圆点指示器,高亮的圆点表示当前位于第几页。故而需要下面三种控件:
(1)翻页视图ViewPager,引导页有几页, ViewPager就有几项。
(2)图像视图ImageView,用于展示每个引导页的背景图。
(3)单选组RadioGroup,用于展示页面底部的一排圆点指示器。
启动引导页的效果
四、碎片Fragment
1. 静态注册
Fragment只占据页面的一小块,Fragment又有自己的生命周期。
每个Fragment都有对应的布局文件,依据其使用方式可分为静态注册与动态注册两类。
静态注册是在布局文件中直接放置fragment节点,类似于一个普通控件,可被多个布局文件同时引用。实现步骤如下:
(1)编写一个碎片的布局文件。
(2)编写一个继承自Fragment的自定义碎片类,并重载onCreateView方法,进行内部控件的显示处理。
(3)在页面的布局文件中引用该碎片。
下面是引用了碎片的页面布局文件
静态注册的碎片界面
静态注册时的碎片生命周期
打开页面的时候
Fragment的onAttach(与Activity结合)→Fragment的onCreate →Fragment的onCreateView(创建碎片视图) →Activity的onCreate→Fragment的onActivityCreated →Activity的onStart→Fragment的onStart →Activity的onResume→Fragment的onResume
退出页面的时候
Fragment的onPause→Activity的onPause →Fragment的onStop→Activity的onStop →Fragment的onDestroyView(回收碎片视图)→Fragment的onDestroy →Fragment的onDetach(与Activity分离)→Activity的onDestroy
2. 动态注册/碎片适配器FragmentStatePagerAdapter
静态注册在布局文件中直接指定Fragment,而动态注册直到在代码中才动态添加Fragment。
动态碎片是给翻页视图用的, ViewPager通过碎片适配器FragmentStatePagerAdapter加载每个动态生成的Fragment。 注意,动态注册的Fragment需要实现静态的newInstance方法,在该方法中调用setArguments函数传入请求参数,然后在Fragment的onCreateView函数中调用getArguments方获得请求数据。
下面是主页面利用翻页视图加载碎片列表的代码例子
动态注册时的碎片生命周期
打开页面的时候
Activity的onCreate→Activity的onStart→Activity的onResume →第一个Fragment的onAttach→第一个Fragment的onCreate →第一个Fragment的onCreateView →第一个Fragment的onStart→第一个Fragment的onResume →第二个Fragment的onAttach→第二个Fragment的onCreate →第二个Fragment的onCreateView →第二个Fragment的onStart→第二个Fragment的onResume
进入活动页面时,实际只加载了第一页和第二页,并没有加载全部Fragment。无论当前位于哪一页,系统都只会加载当前页及相邻的前后两页,总共加载不超过三页。
3. 改进的启动引导页
与前面的启动引导页比较,改进后的启动引导页采用Fragment搭配ViewPager。
一旦发生页面切换,相邻页面就被加载,非相邻页面就被回收。 这么做的好处是节省了宝贵的系统资源,只有用户正在浏览与将要浏览的Fragment才会加载,避免所有页面项一起加载造成资源浪费。
启动引导页的改进效果
五、广播Broadcast基础
1. 发送/接收临时广播
广播(Broadcast)用于Android组件之间的灵活通信,与Activity的区别在于:
(1)Activity只能一对一通信;Broadcast可以一对多,一人发送广播,多人接收处理。
(2)对于发送者来说,广播不需要考虑接收者有没有在工作,接收者在工作就接收广播,不在工作就丢弃广播。
(3)对于接收者来说,会收到各式各样的广播,所以接收者要自行过滤符合条件的广播,才能进行解包处理。
如何使用广播
与广播有关的方法主要有以下3个。
sendBroadcast:发送广播。
registerReceiver:注册接收器,一般在onStart或onResume方法中注册。
unregisterReceiver:注销接收器,一般在onStop或onPause方法中注销。
如果广播是在应用内使用,不需要跨进程,建议使用LocalBroadcastManager下的registerReceiver与unregisterReceiver方法,因为这样不但更有效率,而且不用考虑广播开放造成的安全问题。
2. 定时器AlarmManager
AlarmManager是Android提供的一个全局定时器,利用系统闹钟定时发送广播。
这样做的好处是:如果App提前注册闹钟的广播接收器,即使App退出了,只要定时到达,App就会被唤醒响应广播事件。
AlarmManager的常用方法如下:
set:用于设置一次性定时器。
setRepeating:用于设置重复提醒的定时器,每间隔一段时间就发送定时广播。
如何使用定时器
使用定时器的编码步骤如下:
(1)在页面代码中通过AlarmManager设置闹钟。
(2)在代码中定义一个广播接收器AlarmReceiver。
(3)在AndroidManifest.xml的application节点下增加广播接收器的声明:
<receiver android:name=".AlarmActivity$AlarmReceiver" >
<intent-filter>
<action android:name="com.example.senior.AlarmActivity.AlarmReceiver" />
</intent-filter>
</receiver>
注意,凡是在AndroidManifest.xml中声明的,就叫静态注册;在代码中声明的,叫动态注册。
启用闹钟的效果界面
震动器Vibrator
日程提醒可采用手机震动的方式,会用到震动器Vibrator,它的对象从系统服务VIBRATOR_SERVICE中获取。
震动器的主要方法如下:
hasVibrator:判断设备是否拥有震动器。
vibrate:震动手机。可设定单次震动的时长、多次震动的时长、是否重复震动等。
cancel:取消震动