android中的高级控件(七)

时间:2024-04-04 21:03:07

App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法、列表类视图及其适配器的用法、翻页类视图及其适配器的用法、碎片及其适配器的用法等。 另外介绍四大组件之一广播Broadcast的基本概念与常见用法。

一、日期时间控件

1.日期选择器DatePicker

            日期控件有两种展现形式:

            (1)日期选择器DatePicker,直接显示在界面上。

            (2)日期选择对话框DatePickerDialog,以对话框形式展示。

日期选择器和日期对话框的显示效果

android中的高级控件(七)

2.时间选择器TimePicker

            日期选择器用来选择年月日,时间选择器用来选择时分秒。

             时间控件也有两种展现形式:

            (1)时间选择器TimePicker,直接显示在界面上。

            (2)时间选择对话框TimePickerDialog,以对话框形式展示。 注意时间控件有区分十二小时制和二十四小时制。

时间选择器和时间对话框的效果图

android中的高级控件(七)

二、列表类视图

    1.  基本适配器BaseAdapter

              从BaseAdapter派生的数据适配器主要实现下面3个方法。

              构造函数:指定适配器需要处理的数据集合。

              getCount:获取数据项的个数。

              getView:获取每项的展示视图,并对每项的内部控件进行业务处理。

     基本适配器的编码步骤

          主要编码步骤如下:

          (1)新建列表项的布局文件item_list.xml。

          (2)写个新的适配器继承BaseAdapter,实现对列表项视图的获取与操作。

                     需要重写适配器的两个方法:

                    1)重写getCount方法,返回列表项的个数。

                    2)重写getView方法,根据item_list.xml里面的布局,返回指定位置的列表项的视图内容。

          (3)在页面代码中构造这个基本适配器,并调用Spinner对象的setAdapter方法设置适配器。

   使用基本适配器的行星列表效果

android中的高级控件(七)

     2.  列表视图ListView

               列表视图ListView允许在页面上分行展示相似的数据界面,如新闻列表、商品列表、书籍列表等,方便用户逐行浏览与操作。

列表视图ListView新增的属性与方法

android中的高级控件(七)

如何使用ListView:

     ListView实现了3个与适配器相关的方法。

                setAdapter:设置列表项的数据适配器,适配器一般继承BaseAdapter。

                setOnItemClickListener:设置列表项的点击事件监听器。

                setOnItemLongClickListener:设置列表项的长按事件监听器。

      注意:如果列表项包含EditText、Button、ImageButton、CheckBox等控件,此时点击列表项不会响应点击监听器OnItemClickListener。

     解决办法是给列表项布局的根节点加上descendantFocusability属性,并声明在列表项范围内剥夺子控件的抢占权利,示例如下:     android:descendantFocusability="blocksDescendants"

如何显示列表视图的分隔线

android中的高级控件(七)

采取列表视图的购物车页面

android中的高级控件(七)

     3.  网格视图GridView

网格视图GridView用于分行分列显示表格信息。

GridView新增的属性与方法

android中的高级控件(七)

网格视图的拉伸模式取值

android中的高级控件(七)

网格视图的拉伸模式效果

android中的高级控件(七)

采取网格视图的商场频道页面

android中的高级控件(七)

 三、翻页类视图

      1.  翻页视图ViewPager

           ListView与GridView,一个分行展示,另一个分行又分列,其实都是在垂直方向上下滑动。

          翻页视图ViewPager允许页面在水平方向左右滑动。一个页面就是一个页面项,许多页面组成ViewPager的所有页面项。

  ViewPager新增的方法

android中的高级控件(七)

翻页监听器

       ViewPager通过addOnPageChangeListener方法设置翻页视图的页面切换监听器。该监听器需实现接口OnPageChangeListener下的3个方法,具体说明如下。

            onPageScrollStateChanged(int arg0) :在页面滑动状态变化时触发。arg0取值说明为:0表示静止,1表示正在滑动,2表示滑动完毕。在翻页过程中,状态值变化依次为:正在滑动→滑动完毕→静止。

            onPageScrolled(int arg0, float arg1, int arg2) :在页面滑动过程中触发。第一个参数表示当前页面的序号;第二个参数表示当前页面偏移的百分比,取值为0到1;第三个参数表示当前页面的偏移距离。

           onPageSelected(int arg0) :在选中页面时,即滑动结束后触发。arg0表示当前滑到了哪一个页面。

翻页视图的展示效果

android中的高级控件(七)

      2.  翻页标题栏PagerTitleStrip/PagerTabStrip

              Android提供了两个翻页标题栏控件,用于展示ViewPager的各页面标题。

             (1) PagerTitleStrip,只是单纯的文本标题效果,无法点击进行页面切换。

              (2) PagerTabStrip,类似选项卡效果,文本下面有横线,点击左右选项卡即可切换到对应页面。 要想在标题栏显示指定的文字,需要重写PagerAdapter的getPageTitle方法,在该方法中返回每个页面的标题文本。

翻页视图搭配翻页标题栏的布局文件

android中的高级控件(七)

翻页视图搭配翻页标题栏的界面效果

android中的高级控件(七)

      3.  简单的启动引导页

                  用户安装一个新的App时,第一次启动大多出现欢迎页面,这个引导页通常要往右翻好几页,才会进入App的主页面。启动引导页的效果大多是ViewPager做的。

                每个引导页都由两部分组成,一部分是背景图;另一部分是页面下方的一排圆点指示器,高亮的圆点表示当前位于第几页。故而需要下面三种控件:

             (1)翻页视图ViewPager,引导页有几页, ViewPager就有几项。

             (2)图像视图ImageView,用于展示每个引导页的背景图。

             (3)单选组RadioGroup,用于展示页面底部的一排圆点指示器。

启动引导页的效果

android中的高级控件(七)

四、碎片Fragment

 1. 静态注册

Fragment只占据页面的一小块,Fragment又有自己的生命周期。

每个Fragment都有对应的布局文件,依据其使用方式可分为静态注册与动态注册两类。

静态注册是在布局文件中直接放置fragment节点,类似于一个普通控件,可被多个布局文件同时引用。实现步骤如下:

        (1)编写一个碎片的布局文件。

        (2)编写一个继承自Fragment的自定义碎片类,并重载onCreateView方法,进行内部控件的显示处理。

        (3)在页面的布局文件中引用该碎片。

下面是引用了碎片的页面布局文件

android中的高级控件(七)

静态注册的碎片界面

android中的高级控件(七)

静态注册时的碎片生命周期

    打开页面的时候

          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方获得请求数据。

下面是主页面利用翻页视图加载碎片列表的代码例子

android中的高级控件(七)

动态注册时的碎片生命周期

       打开页面的时候

       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才会加载,避免所有页面项一起加载造成资源浪费。

启动引导页的改进效果    

android中的高级控件(七)

五、广播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中声明的,就叫静态注册;在代码中声明的,叫动态注册。

启用闹钟的效果界面

android中的高级控件(七)

震动器Vibrator

     日程提醒可采用手机震动的方式,会用到震动器Vibrator,它的对象从系统服务VIBRATOR_SERVICE中获取。

      震动器的主要方法如下:

       hasVibrator:判断设备是否拥有震动器。

       vibrate:震动手机。可设定单次震动的时长、多次震动的时长、是否重复震动等。

       cancel:取消震动