android日期选择区间控件_Android日期时间选择器实现以及自定义大小
本文主要讲两个内容: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日期时间选择器实现以及自定义大小相关推荐
- Android 城市选择万能控件
Android 城市选择万能控件 Android 城市选择万能控件,选择城市,选择汽车品牌等等,支持按照a-z.# 排序等的选择控件,废话不多说直接上效果图: (开的Android模拟器录得gif,有 ...
- android 仿旅游日历控件_Android实现仿魅族日历首页功能
flyme5.0增加了很多优美的动画和交互,界面也变得相当精致.我手头现在就用着魅族MX5,感觉还不错哇!经常会打开它的日历看计划等,感觉它首页的滑动效果还不错,就试着实现一把. 效果分析 1 该首页 ...
- android 仿旅游日历控件_Android日历控件MaterialCalendarView
calendar.png 最近项目中需要用到日历控件,1.需要给已经记录的日期添加圆环标记2.给当天日期添加背景3.给周末日期更改颜色4.日历添加农历,需求如上图所示: GitHub的material ...
- android 仿旅游日历控件_android 仿预订日历时间选择(如去哪儿,携程
匿名用户 1级 2018-02-04 回答 看标题就知道了,一个日历选择,类似于去哪儿,携程,酒店预订功能 调用方法 package com.fly.caldroid;import android.a ...
- 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》
目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...
- java 的日期选择控件_Java日期选择控件
一起学习 一次项目研发中需要日期时间选择控件, 网上提供的不多, 且质量一般, 所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser . 目前的代码将日期时间选 ...
- 根据从日期控件选定的时间以表格形式显示数据_VB项目开发FlexGrid控件使用讲解...
FlexGrid控件使用介绍 大家好,在VB开发管理系统中,FlexGrid控件使用是非常普遍的.用FlexGrid ActiveX控件可以在 Visual Basic的窗体中创建一个电子数据表格,也 ...
- java滚动式时间控件_Wdatepicker日期控件的使用指南
二. 功能及示例 1. 常规功能支持多种调用模式 除了支持常规在input单击或获得焦点调用外,还支持使用其他的元素如: 等触发WdatePicker函数来调用弹出日期框 示例1-1-1 常规调用 示 ...
- Android常用酷炫控件(开源项目)github地址汇总
转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...
最新文章
- Android模块化面向接口编程,讲的明明白白!
- 计算机领域的顶级会议和期刊
- 如何修改来自ERP 系统的product category
- linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
- Vue.use自定义自己的全局组件
- c# String 前面不足位数补零的方法 (转贴)
- 看不到图层怎么办_图层管理工具及相关问题
- C/C++ volatile
- Android:BaseAdapter简单应用
- 内部跳转(请求转发)和外部跳转(重定向)的区别?
- iOS10 推送通知详解(UserNotifications)
- MySQL中修改root密码的方法
- [详细]分享验证码接收平台工作原理
- 运动斗士终南山的不老之道
- I Incoming Asteroids(优先队列)
- tda4vm如何SPL方式加载MCU域的核?
- 聊下Android的专利许可和商标
- 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 【CA-TA实战系列九】安全驱动OP-TEE(华为tzdriver)
- 递归算法转换成非递归算法
热门文章
- 6 万出头的北京房价,程序员如何靠自己安家?
- Python 制作动态图表,看全球疫情变化趋势
- 从技术风口到行业应用,开启区块链与产业深度融合之路
- Docker 容器资源管理,你真的学会了吗?
- C/C++ 最易受攻击、70% 漏洞无效,揭秘全球开源组件安全现状
- “别傻了,你不需要区块链!”
- 2019 最新实战!给程序员的 7 节深度学习必修课,最好还会 Python!
- 数据结构与算法之树的遍历
- python2读文件,python之文件的读写(2)
- linux安装挂载samba,【Linux系列】Centos7安装Samba并将工作区挂载到win(八)