Android日期时间选择器实现以及自定义大小
本文主要讲两个内容:1.如何将DatePicker和TimePicker放在一个dialog里面;2.改变他们的宽度;
问题1:其实现思路就是自定义一个Dialog,然后往里面同时放入DatePicker和TimePicker,直接贴代码:
date_time_picker.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" > <!-- <DatePicker
android:id="@+id/new_act_date_picker"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.6"
android:calendarViewShown="false" /> <TimePicker
android:id="@+id/new_act_time_picker"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.3"/> --> <DatePicker
android:id="@+id/new_act_date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:calendarViewShown="false" /> <TimePicker
android:id="@+id/new_act_time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> </LinearLayout>
然后在需要显示日期时间选择器的地方(一般是一个onClickListener中)实例化dialog:
DemoActivity.java
arriveAtBtn.setOnClickListener(new View.OnClickListener(){
@SuppressLint("NewApi")
@Override
public void onClick(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
int year;
int month;
int day;
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
int hour;
int minute;
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, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
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(new View.OnClickListener(){
@SuppressLint("NewApi")
@Override
public void onClick(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() ; // LinearLayout
LinearLayout dpSpinner = (LinearLayout)dpContainer.getChildAt(); // 0 : LinearLayout; 1 : CalendarView
for(int i = ; i < dpSpinner.getChildCount(); i ++) {
NumberPicker numPicker = (NumberPicker)dpSpinner.getChildAt(i); // 0-2 : NumberPicker
LayoutParams params1 = new LayoutParams(, LayoutParams.WRAP_CONTENT);
params1.leftMargin = ;
params1.rightMargin = ;
numPicker.setLayoutParams(params1); // EditText cusET = (EditText)numPicker.getChildAt(0); // CustomEditText
// cusET.setTextSize(14);
// cusET.setWidth(70);
} // Change TimePicker layout
LinearLayout tpContainer = (LinearLayout)timePicker.getChildAt() ; // LinearLayout
LinearLayout tpSpinner = (LinearLayout)tpContainer.getChildAt(); // 0 : LinearLayout; 1 : CalendarView
for(int i = ; i < tpSpinner.getChildCount(); i ++) {
// child(1) is a TextView ( : )
if (i == ) {
continue;
}
NumberPicker numPicker = (NumberPicker)tpSpinner.getChildAt(i); // 0 : NumberPicker; 1 : TextView; 2 : NumberPicker
LayoutParams params3 = new LayoutParams(, LayoutParams.WRAP_CONTENT);
params3.leftMargin = ;
params3.rightMargin = ;
numPicker.setLayoutParams(params3); // EditText cusET = (EditText)numPicker.getChildAt(0); // CustomEditText
// cusET.setTextSize(14);
// cusET.setWidth(70);
} // Init DatePicker
int year;
int month;
int day;
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
int hour;
int minute;
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, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
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)
MyPicker.rar (120 KB)
Android日期时间选择器实现以及自定义大小的更多相关文章
- android日期时间选择器
android原生的日期时间控件,因为是原生的总有其满足不了我们需求的时候,Android 手机版本那么多,用户弹出来的控件五花八门.因为项目需要,在网上找了一 些demo看了看,感觉有些写的很好,很 ...
- 推荐一个android 日期时间选择器(转)
最近接触了日期选择的功能,那么肯定得需要一个日期选择控件,Android 系统有自带的 DatePicker 控件,但是不说这个控件有多 难看吧,现在 Android 手机版本那么多,用户弹出来的控件 ...
- Android日期时间选择器DatePicker、TimePicker日期时间改变事件响应(Android学习笔记)
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- Android中实现日期时间选择器(DatePicker和TimePicker)
利用Android应用框架提供的DatePicker(日期选择器)和TimePicker(时间选择器),实现日期时间选择器. Dialog的Content布局文件(date_time_dialog.x ...
- 微信小程序----日期时间选择器(自定义精确到分秒或时段)
声明 bug:由于此篇博客是在bindcolumnchange事件中做的值的改变处理,因此会出现当你选择时,没有点击确定,直接取消返回后,会发现选择框的值依然改变.造成原因:这一点就是由于在bindc ...
- flatpickr功能强大的日期时间选择器插件
flatpickr日期时间选择器支持移动手机,提供多种内置的主题效果,并且提供对中文的支持.它的特点还有: 使用SVG作为界面的图标. 兼容jQuery. 支持对各种日期格式的解析. 轻量级,高性能, ...
- 24款最好的jQuery日期时间选择器插件
如果你正在创建一个网络表单,有很多事情你需要在你的应用程序中使用.有时您需要特别的输入,从用户的日期和时间,如发票日期,生日,交货时间,或任何其他此类信息.如果你有这样的需要,可以极大地从动态的jQu ...
- 移动端lCalendar纯原生js日期时间选择器
网上找过很多的移动端基于zepto或jquery的日期选择器,在实际产品中也用过一两种,觉得都不太尽如人意,后来果断选择了H5自己的日期input表单,觉得还可以,至少不用引用第三方插件了,性能也不错 ...
- Bootstrap-datepicker日期时间选择器的简单使用
日期时间选择器 目前,bootstrap有两种日历.datepicker和datetimepicker,后者是前者的拓展. Bootstrap日期和时间组件: 使用示例: 从左到右依次是十年视图.年视 ...
随机推荐
- MySQL的相关设置
1.启动MySQL服务:# service mysqld start 2.为MySQL设置root用户密码:# mysql -u root mysql>set password for roo ...
- 锋利的jquery-validation
jquery插件 jquery插件项目托管于gitHub,项目地址https://github.com/jquery/plugins.jquery.com jquery插件的使用 表单验证插件 现在网 ...
- Spark小课堂Week1 Hello Spark
Spark小课堂Week1 Hello Spark 看到Spark这个词,你的第一印象是什么? 这是一朵"火花",官方的定义是Spark是一个高速的.通用的.分布式计算系统!!! ...
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
- Centos7搭建集中式日志系统
在CentOS7中,Rsyslong是一个集中式的日志收集系统,可以运行在TCP或者UDP的514端口上. 目录 开始之前 配置接收日志的主机 配置发送日志的主机 日志回滚 附件:创建日志接收模板 ...
- gulp前端自动化构建工具入门篇
现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用? 什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...
- 关于EndNote X6工具文献管理以及参考文献生成的使用
1 利用endnote下载参考文献 1.1在CNKI中查找文献,在前面打钩,这里显示已经选中两篇文献了。 然后选择导出文献——选择Endnote——导出并保存text文件 打开Endnote——imp ...
- SQL学习中(序)
从校园中走出来已经两年多了,从最初的企业建站到现在的BPM流程开发,深深的感觉到自己底子很差,因此在园子里记录一下学过的知识,以此自勉. 废话到此结束,今天就先来看一下CREATE CHEMA 语句. ...
- SQL 跨服务器数据库增、删、改、查(二)
--创建链接服务器 exec sp_addlinkedserver 'jx3xxiednr3ucidf', ' ', 'SQLOLEDB', 'jx3xxiednr3ucidf' exec sp_ad ...
- 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)
1 HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...