Android TimePicker组件自定义时间_time-picker 设置分钟秒为0000-程序员宅基地

技术标签: calendar  button  exception  layout  service  android  

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

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

 

 

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

 

TimePicker组件其实继承FrameLayout的,可以算的上是一个布局,就像那些TabHost等等的布局一样

在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));

初始化时间

关于在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

 

分析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布局文件

分析R.layout.number_picker文件

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

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

 

说了这么多下面我来说重点了,其实我们每次点击+或-都会触发这个监听函数

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

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

下面我来说个业务需求

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

要么秒是30,

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

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

 

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

timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

          

           @Override

        publicvoid 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);

                  }

                  elseif(minute == 29){ //30---->29

                     mCurrent.set(value, 0);

                     mCurrentMinute.set(view, 0);

               }

                  } catch (Exception e) {

                  e.printStackTrace();

              }

           }

     });

详细的说明请看源码

转自: http://xiaoliefengfeng.iteye.com/blog/1177323
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/az313/article/details/8084720

智能推荐

python百元买百鸡问题编程,python计算百钱买百鸡_百鸡百钱python-程序员宅基地

文章浏览阅读2.3k次,点赞10次,收藏10次。百钱百鸡问题是一个著名的数学问题,可以使用多种方法求解。_百鸡百钱python

毕业设计 基于51单片机的心率体温检测系统的设计_51单片机能做心率血氧-程序员宅基地

文章浏览阅读294次。本次设计由于脉搏信号本身就比较微弱,所以是通过比较灵敏的红外光电传感器来采集脉搏信号。因此首先要将滤波处理的波形进行适当的运放;故本次课题的设计最终决定采用的是LM393比较器[11]。使用方法:当传感器接口端接入传感器时,通过参考电压调节电位器调整产生基准电压,传感器与分压电阻产生的电压与基准电压进行比较,实现高低电平的比较结果输出。_51单片机能做心率血氧

ROS2初级知识(4): 理解【服务】的概念_ros2服务发现-程序员宅基地

文章浏览阅读3.6k次。ROS2通信基本的概念有九个,分别是:Node、topic、service、actions、rqt、launch、record-play、backdata、parameter;本文着重讲述service概念。_ros2服务发现

微信查券机器人搭建_淘客机器人管理后台-程序员宅基地

文章浏览阅读519次。微信查券机器人搭建1、淘客机器人是什么?有什么价值?简单的说,淘客机器人是一个可以帮你赚钱的工具,它通过帮助用户查询商品的优惠券来获得官方联盟(一般指阿里妈妈、京东联盟、多多进宝等)的佣金。如果你想让更多的用户来使用你的机器人,可以返利一部分佣金给购买者,这样用的人越多,你就可以躺着赚钱了。参考2、公众号淘客机器人系统免费版:公众号淘客机器人自助搭建教程http://www.wlkankan.cn/cate50/221.html3、微信订阅号可以接入吗?可以,系统支持订阅号的的淘客机器人系统,_淘客机器人管理后台

深入浅出XDL(二):embedding_深入浅出embedding pdf-程序员宅基地

文章浏览阅读2.3k次。XDL(X-DeepLearning)是阿里巴巴开源的一款深度学习框架。官方介绍,此框架针对广告、推荐、搜索的场景做了很多优化。广告、推荐和搜索的模型,一个重要的特点是存在大量的稀疏特征,为此xdl提供了稀疏API:APIxdl.embedding计算单路稀疏特征的embeddingxdl.merged_embedding同时计算多路稀疏特征的embedding,..._深入浅出embedding pdf

告警处理子系统(SNET)-程序员宅基地

文章浏览阅读719次。《空中交通管制自动化系统最低安全高度告警及短期飞行冲突告警功能》(MH/T4022-2006) SNET将和MSDP部署在同一台服务器上。 SNET子系统读取共享内存中更新的多监视源融合数据(包括MS..._空管 ntz告警实现

随便推点

兼容NVIDIA Jetson Xavier AGX/Orin的GMSL 设计与调试_gw5200 isp-程序员宅基地

文章浏览阅读7k次,点赞5次,收藏45次。一、设计目标 1. 支持Jetson Xavier AGX Devkit 开发套件120Pin (QSH-060-01-H-D-A-K-TR Samtec)2. GMSL Deserializer 采用 MAX9296 3. 支持多路 MAX9295 Serializer相机 4. 同时兼容MAX96705即GMSL1 5. 支持Virtual Channel 6. 支持Frame sync和..._gw5200 isp

如何生成ssh公钥(ssh-keygen)_ssh genkey-程序员宅基地

文章浏览阅读2.1w次,点赞5次,收藏18次。你可以按如下命令来生成 sshkey:ssh-keygen -t rsa -C "[email protected]" # Generating public/private rsa key pair...# 三次回车即可生成 ssh key查看你的 public key,并把他添加到码云(Gitee.com) SSH key添加地址:https://gitee.com/pr..._ssh genkey

探索大数据架构之美:揭秘《BigDataArchitect》项目-程序员宅基地

文章浏览阅读314次,点赞3次,收藏6次。探索大数据架构之美:揭秘《BigDataArchitect》项目项目地址:https://gitcode.com/bjmashibing/BigDataArchitect项目简介在数字化时代的洪流中,大数据已经成为企业和开发者不可或缺的一部分。《BigDataArchitect》 是一个专注于大数据解决方案和架构设计的开源项目,由知名数据专家BJMashibing 创建并维护。它旨在为大数据..._big data architecture

formSelects为多选下拉动态改变现有选项与选中值,对下拉内容进行更新并赋新值,再刷新。_formselects 为页面动态添加的多选下拉列表框赋值-程序员宅基地

文章浏览阅读110次。【代码】formSelects为多选下拉动态改变现有选项与选中值,对下拉内容进行更新并赋新值,再刷新。_formselects 为页面动态添加的多选下拉列表框赋值

C++中档题:统计元音_统计每个元音字母在字符串中出现的次数。 输入 输入数据首先包括一个整数n,表示测-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。统计元音题目描述统计每个元音字母在字符串中出现的次数。输入输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串,只由小写字母组成。输出对于每个测试实例输出5行,格式如下: a:num1 e:num2 i:num3 o:num4 u:num5 多个测试实例之间由一个空行隔开。 请特别注意:最后一块输出后面没有空行:)样例输入 Copy2aeioumy name is ignatius样例输出 Copya:1e:1i:1o:1u:1a:2e:_统计每个元音字母在字符串中出现的次数。 输入 输入数据首先包括一个整数n,表示测

Flowable入门系列文章177 - 组信息的管理_flowable怎么关联自己的组-程序员宅基地

文章浏览阅读2.9k次。flowable入门、flowable现状、flowable开源产品、flwoable入门系列、flowable课程、flowable与activiti区别Flowable是用Java编写的轻量级业务流程引擎。Flowable流程引擎允许您部署BPMN 2.0流程定义(用于定义流程的行业XML标准),创建流程定义的流程实例,运行查询,访问活动或历史流程实例以及相关数据等等。本节将逐步介绍各种概念和API,通过您可以在自己的开发机器上进行的实例进行实现。_flowable怎么关联自己的组

推荐文章

热门文章

相关标签