本文主要讲两个内容:1.如何将DatePicker和TimePicker放在一个dialog里面;2.改变他们的宽度;

问题1:其实现思路就是自定义一个Dialog,然后往里面同时放入DatePicker和TimePicker,直接贴代码:

date_time_picker.xml:

android:id="@+id/new_act_date_picker"android:layout_width="wrap_content"android:layout_height="wrap_content"android:calendarViewShown="false" />

android:id="@+id/new_act_time_picker"android:layout_width="wrap_content"android:layout_height="wrap_content"/>

然后在需要显示日期时间选择器的地方(一般是一个onClickListener中)实例化dialog:

DemoActivity.java

arriveAtBtn.setOnClickListener(newView.OnClickListener(){

@SuppressLint("NewApi")

@Overridepublic voidonClick(View v) {

View view= View.inflate(getApplicationContext(), R.layout.date_time_picker, null);

final DatePicker datePicker=(DatePicker)view.findViewById(R.id.new_act_date_picker);

final TimePicker timePicker=(TimePicker)view.findViewById(R.id.new_act_time_picker);//Init DatePicker

intyear;intmonth;intday;if(StringUtils.isEmpty(arriveDateBtn.getText().toString())) {//Use the current date as the default date in the picker

final Calendar c =Calendar.getInstance();

year= c.get(Calendar.YEAR);

month= c.get(Calendar.MONTH);

day= c.get(Calendar.DAY_OF_MONTH);

}else{

year=NewActActivity.arrive_year;

month=NewActActivity.arrive_month;

day=NewActActivity.arrive_day;

}

datePicker.init(year, month, day,null);//Init TimePicker

inthour;intminute;if(StringUtils.isEmpty(arriveTimeBtn.getText().toString())) {//Use the current time as the default values for the picker

final Calendar c =Calendar.getInstance();

hour= c.get(Calendar.HOUR_OF_DAY);

minute= c.get(Calendar.MINUTE);

}else{

hour=NewActActivity.arrive_hour;

minute=NewActActivity.arrive_min;

}

timePicker.setIs24HourView(true);

timePicker.setCurrentHour(hour);

timePicker.setCurrentMinute(minute);//Build DateTimeDialog

AlertDialog.Builder builder = new AlertDialog.Builder(NewActActivity.this);

builder.setView(view);

builder.setTitle(R.string.new_act_date_time_picker_title);

builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {

@Overridepublic void onClick(DialogInterface dialog, intwhich) {

arrive_year=datePicker.getYear();

arrive_month=datePicker.getMonth();

arrive_day=datePicker.getDayOfMonth();

String dateStr=DateUtil.formatDate(arrive_year, arrive_month, arrive_day);

arriveDateBtn.setText(dateStr);

arrive_hour=timePicker.getCurrentHour();

arrive_min=timePicker.getCurrentMinute();

String timeStr=DateUtil.formatTime(arrive_hour, arrive_min);

arriveTimeBtn.setText(timeStr);

}

});

builder.show();

}

});

这样就可以实现日期时间选择器了,这里就有点layout上的小问题,你是需要datepicker和timepicker水平排列还是竖直排列,竖直排列是没问题的:下面给出两个数值排列的效果图:

(1)DatePicker控件中设置android:calendarViewShown="false" 时的效果图:

(2)(1)DatePicker控件中设置android:spinnersShown="false" 时的效果图:

当然,如果你android:calendarViewShown和android:spinnersShown都不设置为false的话,会同时显示日历和滚动条样式,我想一般不会有人想要这样的视图吧。

水平排列是有问题的,那就是屏幕太挤,两个控件显示不全,看看效果图:

可是有人就是有水平排列的需求怎么办?这就是本文要讲的第二个问题:改变datepicker和timepicker的宽度。

网上找了很久,没有发现很有效的方法,说是这两个控件的子元素的宽度是不能自定义的,实际上把控件的所有属性看了一遍,也确实没有发现相关的属性;有人是通过自定义DatePicker和TimePicker来实现的,找了个demo,确实是实现了,不过已经相当于是自己写了一个插件了,我嫌麻烦,加之稳定性方面的考虑,没有去用,不过我会在最后把这个demo的src带上,有需要的人可以自己下载来研究。难道真不能改宽度吗?突然想到我是不是能从代码中的datePicker对象一步步往下找到其child,直接改child的宽度呢,于是debug,果然通过这种方式成功改变了宽度值,代码如下,只要在DemoActivity.java中增加一块专门用于实现改宽度的代码就行:

DemoActivity.java:

arriveAtBtn.setOnClickListener(newView.OnClickListener(){

@SuppressLint("NewApi")

@Overridepublic voidonClick(View v) {

View view= View.inflate(getApplicationContext(), R.layout.date_time_picker, null);

final DatePicker datePicker=(DatePicker)view.findViewById(R.id.new_act_date_picker);

final TimePicker timePicker=(TimePicker)view.findViewById(R.id.new_act_time_picker);//Change DatePicker layout

LinearLayout dpContainer = (LinearLayout)datePicker.getChildAt(0) ; //LinearLayout

LinearLayout dpSpinner = (LinearLayout)dpContainer.getChildAt(0); //0 : LinearLayout; 1 : CalendarView

for(int i = 0; i < dpSpinner.getChildCount(); i ++) {

NumberPicker numPicker= (NumberPicker)dpSpinner.getChildAt(i); //0-2 : NumberPicker

LayoutParams params1 = new LayoutParams(120, LayoutParams.WRAP_CONTENT);

params1.leftMargin= 0;

params1.rightMargin= 30;

numPicker.setLayoutParams(params1);//EditText cusET = (EditText)numPicker.getChildAt(0);//CustomEditText//cusET.setTextSize(14);//cusET.setWidth(70);

}//Change TimePicker layout

LinearLayout tpContainer = (LinearLayout)timePicker.getChildAt(0) ; //LinearLayout

LinearLayout tpSpinner = (LinearLayout)tpContainer.getChildAt(0); //0 : LinearLayout; 1 : CalendarView

for(int i = 0; i < tpSpinner.getChildCount(); i ++) {//child(1) is a TextView ( : )

if (i == 1) {continue;

}

NumberPicker numPicker= (NumberPicker)tpSpinner.getChildAt(i); //0 : NumberPicker; 1 : TextView; 2 : NumberPicker

LayoutParams params3 = new LayoutParams(100, LayoutParams.WRAP_CONTENT);

params3.leftMargin= 0;

params3.rightMargin= 30;

numPicker.setLayoutParams(params3);//EditText cusET = (EditText)numPicker.getChildAt(0);//CustomEditText//cusET.setTextSize(14);//cusET.setWidth(70);

}//Init DatePicker

intyear;intmonth;intday;if(StringUtils.isEmpty(arriveDateBtn.getText().toString())) {//Use the current date as the default date in the picker

final Calendar c =Calendar.getInstance();

year= c.get(Calendar.YEAR);

month= c.get(Calendar.MONTH);

day= c.get(Calendar.DAY_OF_MONTH);

}else{

year=NewActActivity.arrive_year;

month=NewActActivity.arrive_month;

day=NewActActivity.arrive_day;

}

datePicker.init(year, month, day,null);//Init TimePicker

inthour;intminute;if(StringUtils.isEmpty(arriveTimeBtn.getText().toString())) {//Use the current time as the default values for the picker

final Calendar c =Calendar.getInstance();

hour= c.get(Calendar.HOUR_OF_DAY);

minute= c.get(Calendar.MINUTE);

}else{

hour=NewActActivity.arrive_hour;

minute=NewActActivity.arrive_min;

}

timePicker.setIs24HourView(true);

timePicker.setCurrentHour(hour);

timePicker.setCurrentMinute(minute);//Build DateTimeDialog

AlertDialog.Builder builder = new AlertDialog.Builder(NewActActivity.this);

builder.setView(view);

builder.setTitle(R.string.new_act_date_time_picker_title);

builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {

@Overridepublic void onClick(DialogInterface dialog, intwhich) {

arrive_year=datePicker.getYear();

arrive_month=datePicker.getMonth();

arrive_day=datePicker.getDayOfMonth();

String dateStr=DateUtil.formatDate(arrive_year, arrive_month, arrive_day);

arriveDateBtn.setText(dateStr);

arrive_hour=timePicker.getCurrentHour();

arrive_min=timePicker.getCurrentMinute();

String timeStr=DateUtil.formatTime(arrive_hour, arrive_min);

arriveTimeBtn.setText(timeStr);

}

});

builder.show();

}

});

通过这种方式实现的效果图如下:

其实这种方法也有问题:我的手机是1080P(5.5寸)的屏,显示效果是这样,如果屏幕小点,分辨率更低的屏呢,很可能屏幕宽度不够显示,当然你可以修改一下上面代码的逻辑,根据屏幕大小来动态设置控件的宽度值,而不是设成定值,具体的这些细节按自己的需求来做吧,我这里只是想记录一下自己发现的这种改变datepicker和timepicker宽度的方法,至于是否实用,我不负责,我只当是学习一下android。不过我的项目里最终没有用这个方案,最终选择了垂直排列的日历格式那个方案。

最后附上别人实现的自定义DatePicker和TimePicker(MyPicker)

android日期选择区间控件_Android日期时间选择器实现以及自定义大小相关推荐

  1. Android 城市选择万能控件

    Android 城市选择万能控件 Android 城市选择万能控件,选择城市,选择汽车品牌等等,支持按照a-z.# 排序等的选择控件,废话不多说直接上效果图: (开的Android模拟器录得gif,有 ...

  2. android 仿旅游日历控件_Android实现仿魅族日历首页功能

    flyme5.0增加了很多优美的动画和交互,界面也变得相当精致.我手头现在就用着魅族MX5,感觉还不错哇!经常会打开它的日历看计划等,感觉它首页的滑动效果还不错,就试着实现一把. 效果分析 1 该首页 ...

  3. android 仿旅游日历控件_Android日历控件MaterialCalendarView

    calendar.png 最近项目中需要用到日历控件,1.需要给已经记录的日期添加圆环标记2.给当天日期添加背景3.给周末日期更改颜色4.日历添加农历,需求如上图所示: GitHub的material ...

  4. android 仿旅游日历控件_android 仿预订日历时间选择(如去哪儿,携程

    匿名用户 1级 2018-02-04 回答 看标题就知道了,一个日历选择,类似于去哪儿,携程,酒店预订功能 调用方法 package com.fly.caldroid;import android.a ...

  5. 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》

    目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...

  6. java 的日期选择控件_Java日期选择控件

    一起学习 一次项目研发中需要日期时间选择控件, 网上提供的不多, 且质量一般, 所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser . 目前的代码将日期时间选 ...

  7. 根据从日期控件选定的时间以表格形式显示数据_VB项目开发FlexGrid控件使用讲解...

    FlexGrid控件使用介绍 大家好,在VB开发管理系统中,FlexGrid控件使用是非常普遍的.用FlexGrid ActiveX控件可以在 Visual Basic的窗体中创建一个电子数据表格,也 ...

  8. java滚动式时间控件_Wdatepicker日期控件的使用指南

    二. 功能及示例 1. 常规功能支持多种调用模式 除了支持常规在input单击或获得焦点调用外,还支持使用其他的元素如: 等触发WdatePicker函数来调用弹出日期框 示例1-1-1 常规调用 示 ...

  9. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

最新文章

  1. Android模块化面向接口编程,讲的明明白白!
  2. 计算机领域的顶级会议和期刊
  3. 如何修改来自ERP 系统的product category
  4. linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
  5. Vue.use自定义自己的全局组件
  6. c# String 前面不足位数补零的方法 (转贴)
  7. 看不到图层怎么办_图层管理工具及相关问题
  8. C/C++ volatile
  9. Android:BaseAdapter简单应用
  10. 内部跳转(请求转发)和外部跳转(重定向)的区别?
  11. iOS10 推送通知详解(UserNotifications)
  12. MySQL中修改root密码的方法
  13. [详细]分享验证码接收平台工作原理
  14. 运动斗士终南山的不老之道
  15. I Incoming Asteroids(优先队列)
  16. tda4vm如何SPL方式加载MCU域的核?
  17. 聊下Android的专利许可和商标
  18. 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
  19. 【CA-TA实战系列九】安全驱动OP-TEE(华为tzdriver)
  20. 递归算法转换成非递归算法

热门文章

  1. 6 万出头的北京房价,程序员如何靠自己安家?
  2. Python 制作动态图表,看全球疫情变化趋势
  3. 从技术风口到行业应用,开启区块链与产业深度融合之路
  4. Docker 容器资源管理,你真的学会了吗?
  5. C/C++ 最易受攻击、70% 漏洞无效,揭秘全球开源组件安全现状
  6. “别傻了,你不需要区块链!”
  7. 2019 最新实战!给程序员的 7 节深度学习必修课,最好还会 Python!
  8. 数据结构与算法之树的遍历
  9. python2读文件,python之文件的读写(2)
  10. linux安装挂载samba,【Linux系列】Centos7安装Samba并将工作区挂载到win(八)