`
xiaoliefengfeng
  • 浏览: 67804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android组件TimePicker组件的深入解析

 
阅读更多

 

Android组件TimePicker组件的深入解析,自定义TimePicker组件,实现时间的秒数只显示00或者30,实现时间的整点选择或半点选择

上截图(注意文章中有些截图没上,如果想看请下载附件里面的文档)

 

 

大家注意设置时间的时候分钟只能设置00或者30,这就是我自定义的,因为最近公司有这样的属性,需要用户提交的时间是整点或者半点

 

<!--[if !supportLists]-->1.  <!--[endif]-->TimePicker组件其实继承FrameLayout的,可以算的上是一个布局,就像那些TabHost等等的布局一样

<!--[if !supportLists]-->2.  <!--[endif]-->TimePicker的构造函数里面,

public TimePicker(Context context, AttributeSet attrs, int defStyle)

我们看到了这样的代码

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        inflater.inflate(R.layout.time_picker,this, // we are the parent

            true);

一看我们就应该知道了,其实TimePicker也是一种布局,而且他有自己的布局文件R.layout.time_picker

其实在这个构造函数里面我们知道,android的底层其实也是调用java

// initialize to current time

        Calendar cal = Calendar.getInstance();

这个函数来获取时间的

// by default we're not in 24 hour mode

         setCurrentHour(cal.get(Calendar.HOUR_OF_DAY));

     setCurrentMinute(cal.get(Calendar.MINUTE));

初始化时间

<!--[if !supportLists]-->3.  <!--[endif]-->关于在TimePicker的构造函数里加载的R.layout.time_picker我们打开android的平台文件夹

如:

F:\android-sdk-windows\platforms\android-8\data\res\layout在此文件夹下面我们找到了time_picker.xml文件,打开此布局文件我们看到了两个NumberPicker元属和一个Button元属,此控件的效果图就是这样的(注意此处截图没上,如果需要请下载附件的文档)

用过TimePicker控件的朋友应该知道,此控件会自动生成一个按钮,此按钮是显示AM/PM的,其实我们也可以通过函数

TimePicker.setIs24HourView(true);//设置时间格式为24小时制

来设置TimePicker的时间显示法,默认情况下此属性值为false

 

<!--[if !supportLists]-->4.  <!--[endif]-->分析NumberPicker组件,我们找到android的源码找到NumberPicker.java在此类里面我们看到了此类其实是继承LinearLayout由此可知,其实NumberPicker组件也是一个布局元属

NumberPicker的构造函数里面我们同样看到了

LayoutInflater           inflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        inflater.inflate(R.layout.number_picker, this, true);

这样的代码,由此我们找到R.layout.number_picker布局文件

<!--[if !supportLists]-->5.  <!--[endif]-->分析R.layout.number_picker文件

如:F:\android-sdk-windows\platforms\android-8\data\res\layout在这样的路径下面我们可以找到R.layout.number_picker.xml布局文件 打开此布局文件,我们看到这样的代码

有两个NumberPickerButton和一个EditText其实分析我们不难知道其实这个布局文件生成的样式就是这样的

 

<!--[if !supportLists]-->6.  <!--[endif]-->说了这么多下面我来说重点了,其实我们每次点击+-都会触发这个监听函数

setOnTimeChangedListener所以如果我们需要对时间进行定制的话,我们可以使用此监听器来做一些事情此监听器会插入三个参数很好的是他把TimePicker对象也传入进来了

public void onTimeChanged(TimePicker view, int hourOfDay, int minute)

下面我来说个业务需求

我们要为用户提供一个选择时间的界面,但用户选择时间秒的时候用户只有两个选择要是秒是00,

要么秒是30,

我们该如何来做出这样的应用了,下面我就告诉大家我是如何做出这样的应用的

通过上面我们对TimePicker的源码架构分析可以知道其实我们只要通过java强大的反射机制来修改源码里面的一些属性值就可以做到了

 

<!--[if !supportLists]-->1.     <!--[endif]-->TimePicker类里面我们找到private final NumberPicker mMinutePicker; 属性因为第3步我们分析了TimePicker的布局构成。是由两个NumberPicker元属和一个Button元属构成的布局文件,我们为什么要反射这个属性了,因为这个属性实现的布局文件里面用到了NumberPickerNumberPicker是我们设置时间的小时和分钟的组件通过反射mMinutePicker属性我们可以拿到mMinutePicker的实例对象然后通过此对象我们需要反射出NumberPicker里面的mCurrent属性和mCurrentMinute,然后我们重新对这两个属性赋值就可以了下面来看我的代码实现

timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

          

           @Override

        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

       try {

                  Field mMinutePicker = view.getClass().getDeclaredField("mMinutePicker");

                 

                  mMinutePicker.setAccessible(true);

                  Object value = mMinutePicker.get(view);

                  Log.i(TAG,value.getClass()+"");

//反射NumberPicker里面的mCurrent此属性值是显示给用户看的         

                  Field mCurrent = value.getClass().getDeclaredField("mCurrent");

                  mCurrent.setAccessible(true);

                  //反射TimePicker类里面的mCurrentMinute属性,此属性是保存用户设置的时间

                  Field mCurrentMinute = view.getClass().getDeclaredField("mCurrentMinute");

                  mCurrentMinute.setAccessible(true);

                 

                  if(minute>0&&minute<30){

                     mCurrent.set(value, 30);

                     mCurrentMinute.set(view, 30);

                  }

                  else{

                     mCurrent.set(value, 0);

                     mCurrentMinute.set(view, 0);

                  }

                 

                  //判断用户是否点击了减按钮

                  if(minute==59){//如果点击了时间的减按钮那么minute值为00---->5930---->29

                     //00---->59

                     mCurrent.set(value, 30);

                     mCurrentMinute.set(view, 30);

                  }

                  else if(minute == 29){//30---->29

                     mCurrent.set(value, 0);

                     mCurrentMinute.set(view, 0);

               }

                  } catch (Exception e) {

                  e.printStackTrace();

              }

           }

     });

详细的说明请看源码

 

 

分享到:
评论
5 楼 u013226053 2015-08-31  
zw_lovec 写道
楼主 为什么我下下来的代码运行没看到你说的这种效果呢?

确实没有,怎么解决??
4 楼 zw_lovec 2013-05-24  
楼主 为什么我下下来的代码运行没看到你说的这种效果呢?
3 楼 sf03001620 2013-02-25  
有帮助。来个熊抱下
2 楼 yangyanligoodo 2012-12-03  
学习一下,看看。
1 楼 enlangs 2012-04-16  
学习。
非常感谢。。。

相关推荐

    Android 自定义TimePicker组件

    本文将深入解析TimePicker组件,并介绍如何进行自定义,以满足更加个性化的应用需求。 首先,我们来了解TimePicker的基本用法。在Android SDK中,TimePicker分为两种模式:数字时钟(digital)和模拟时钟(analog)...

    修改TimePicker时间间隔

    本篇文章将深入解析TimePicker组件,并介绍如何自定义TimePicker以实现分钟间隔为5分钟的选择。这对于创建特定时间选择场景,如定时任务、闹钟设定等,是非常有用的。 **TimePicker的基本用法** TimePicker是...

    修改TimePicker时间间隔效果

    修改TimePicker时间间隔效果,Android组件TimePicker组件的深入解析,自定义TimePicker组件,实现分钟间隔为5分钟选择,希望大家能够喜欢,如果有什么新的效果,大家也可以在这里留下。

    android日期和时间选择器

    本文将深入探讨“android日期和时间选择器”这一主题,包括其基本使用、自定义实现以及相关API的详细解析。 ### 1. Android原生日期和时间选择器 Android系统提供了两种内置的日期和时间选择器:`DatePicker`和`...

    android控件中英对照

    在深入解析标题与描述所指的“Android控件中英对照”之前,我们首先需要理解Android系统及其应用开发环境的基本概念。Android是Google开发的一款基于Linux内核的操作系统,主要用于移动设备,如智能手机和平板电脑。...

    时间选择器Android源码

    这篇内容将深入解析一个名为"TimePicker-master"的开源项目,这个项目提供了自定义时间选择器的源码,帮助开发者更灵活地实现个性化的时间选择功能。 首先,`TimePicker`是Android SDK中的一个原生控件,位于`...

    Android应用源码之android-times-square Android日历部件.zip

    《Android应用源码解析:深入理解android-times-square日历部件》 在移动应用开发领域,尤其是在Android平台上,日历部件是不可或缺的一个组件。本篇文章将深入探讨开源项目`android-times-square`,它是一个专为...

    android 日期和时间选择 源码

    在Android开发中,日期和时间选择是常见的用户交互需求,比如在设置提醒、创建事件或者填写表单时。本文将详细解析如何实现一个...通过分析`SelectTime`中的源码,我们可以更深入地了解Android UI组件的使用和自定义。

    Android应用开发完全自学手册

    这本书旨在帮助初学者系统地学习并掌握Android应用的开发技能,通过源代码解析来提升实践能力。 第1章:Android开发基础 在这一章中,读者将学习Android开发的基本概念和环境搭建,包括安装Android Studio IDE、...

    android日历农历

    总之,开发一个具备农历功能的Android日历应用,涉及到Android组件、日期处理、数据库操作、UI设计等多个方面,需要开发者具备全面的技术知识和良好的编程习惯。通过对`CalendarActivity.java`、`ChineseCalendarGB....

    Android 手机小闹钟源码-IT计算机-毕业设计.zip

    这涉及到Java的Date和Calendar类,以及Android的TimePicker和DatePicker组件。 11. **权限管理**:Android系统有严格的权限管理,如访问网络、读写文件等都需要在Manifest文件中声明相应的权限。 12. **版本兼容性...

    Android手机程序设计实用教程_PPT.zip

    2. **第2章 Android程序的结构**:详细解析了一个标准Android项目的目录结构和组件,如AndroidManifest.xml文件、布局文件、资源文件等。此外,本章还会讨论Activity、Intent、Service等核心组件的作用及其交互方式...

    Android中文翻译组 ——android.widget合集(中) 免费

    这篇文档是Android开发中关于`android.widget`包的一个中文翻译合集,主要针对Android平台上常用的Widget组件进行深入解析。`android.widget`是Android SDK中的核心包之一,包含了大量用于构建用户界面(UI)的基本...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    AndroidWheel Android Wheel支持城市、多种日期时间、密码、图片-IT计算机-毕业设计.zip

    这篇文档将深入解析《AndroidWheel》这一Android应用源码,它是专门为毕业设计学习而准备的。这个项目展示了如何在Android平台上实现一个多功能的轮盘组件,涵盖了城市选择、日期时间选择、密码输入以及图片浏览等...

    《从零开始学Android编程》 PDF

    在“Android高级控件”部分,作者可能会深入到更复杂的控件,如Spinner、DatePicker、TimePicker、ListView和GridView。这些控件允许开发者实现更丰富的用户交互,如下拉列表选择、日期时间选择、列表滚动等。此外,...

    Android应用源码之MyDateTimePickerDialog.zip

    源码分析可以帮助我们深入理解Android UI组件的实现原理,以及如何自定义控件以满足特定设计需求。 1. **Android Dialogs**: `MyDateTimePickerDialog`是基于Android原生的`AlertDialog`进行自定义的。`AlertDialog...

    疯狂Android讲义源码

     1.6 Android应用的基本组件  介绍 31  1.6.1 Activity和View 31  1.6.2 Service 32  1.6.3 BroadcastReceiver 32  1.6.4 ContentProvider 32  1.6.5 Intent和IntentFilter 33  1.7 本章小结 33  第2章 ...

    Android实现机房座位预约系统

    对于界面设计,Android提供了丰富的UI组件,如RecyclerView用于展示列表数据,DatePicker和TimePicker用于选择日期和时间,以及各种对话框和提示框,帮助用户完成操作。此外,考虑到用户体验,可能还采用了Material ...

Global site tag (gtag.js) - Google Analytics