本文主要讲两个内容: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日期时间选择器实现以及自定义大小的更多相关文章

  1. android日期时间选择器

    android原生的日期时间控件,因为是原生的总有其满足不了我们需求的时候,Android 手机版本那么多,用户弹出来的控件五花八门.因为项目需要,在网上找了一 些demo看了看,感觉有些写的很好,很 ...

  2. 推荐一个android 日期时间选择器(转)

    最近接触了日期选择的功能,那么肯定得需要一个日期选择控件,Android 系统有自带的 DatePicker 控件,但是不说这个控件有多 难看吧,现在 Android 手机版本那么多,用户弹出来的控件 ...

  3. Android日期时间选择器DatePicker、TimePicker日期时间改变事件响应(Android学习笔记)

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  4. Android中实现日期时间选择器(DatePicker和TimePicker)

    利用Android应用框架提供的DatePicker(日期选择器)和TimePicker(时间选择器),实现日期时间选择器. Dialog的Content布局文件(date_time_dialog.x ...

  5. 微信小程序----日期时间选择器(自定义精确到分秒或时段)

    声明 bug:由于此篇博客是在bindcolumnchange事件中做的值的改变处理,因此会出现当你选择时,没有点击确定,直接取消返回后,会发现选择框的值依然改变.造成原因:这一点就是由于在bindc ...

  6. flatpickr功能强大的日期时间选择器插件

    flatpickr日期时间选择器支持移动手机,提供多种内置的主题效果,并且提供对中文的支持.它的特点还有: 使用SVG作为界面的图标. 兼容jQuery. 支持对各种日期格式的解析. 轻量级,高性能, ...

  7. 24款最好的jQuery日期时间选择器插件

    如果你正在创建一个网络表单,有很多事情你需要在你的应用程序中使用.有时您需要特别的输入,从用户的日期和时间,如发票日期,生日,交货时间,或任何其他此类信息.如果你有这样的需要,可以极大地从动态的jQu ...

  8. 移动端lCalendar纯原生js日期时间选择器

    网上找过很多的移动端基于zepto或jquery的日期选择器,在实际产品中也用过一两种,觉得都不太尽如人意,后来果断选择了H5自己的日期input表单,觉得还可以,至少不用引用第三方插件了,性能也不错 ...

  9. Bootstrap-datepicker日期时间选择器的简单使用

    日期时间选择器 目前,bootstrap有两种日历.datepicker和datetimepicker,后者是前者的拓展. Bootstrap日期和时间组件: 使用示例: 从左到右依次是十年视图.年视 ...

随机推荐

  1. MySQL的相关设置

    1.启动MySQL服务:#  service mysqld start 2.为MySQL设置root用户密码:# mysql -u root mysql>set password for roo ...

  2. 锋利的jquery-validation

    jquery插件 jquery插件项目托管于gitHub,项目地址https://github.com/jquery/plugins.jquery.com jquery插件的使用 表单验证插件 现在网 ...

  3. Spark小课堂Week1 Hello Spark

    Spark小课堂Week1 Hello Spark 看到Spark这个词,你的第一印象是什么? 这是一朵"火花",官方的定义是Spark是一个高速的.通用的.分布式计算系统!!! ...

  4. Spark Streaming揭秘 Day32 WAL框架及实现

    Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...

  5. Centos7搭建集中式日志系统

    在CentOS7中,Rsyslong是一个集中式的日志收集系统,可以运行在TCP或者UDP的514端口上.   目录 开始之前 配置接收日志的主机 配置发送日志的主机 日志回滚 附件:创建日志接收模板 ...

  6. gulp前端自动化构建工具入门篇

    现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用?   什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...

  7. 关于EndNote X6工具文献管理以及参考文献生成的使用

    1 利用endnote下载参考文献 1.1在CNKI中查找文献,在前面打钩,这里显示已经选中两篇文献了。 然后选择导出文献——选择Endnote——导出并保存text文件 打开Endnote——imp ...

  8. SQL学习中(序)

    从校园中走出来已经两年多了,从最初的企业建站到现在的BPM流程开发,深深的感觉到自己底子很差,因此在园子里记录一下学过的知识,以此自勉. 废话到此结束,今天就先来看一下CREATE CHEMA 语句. ...

  9. SQL 跨服务器数据库增、删、改、查(二)

    --创建链接服务器 exec sp_addlinkedserver 'jx3xxiednr3ucidf', ' ', 'SQLOLEDB', 'jx3xxiednr3ucidf' exec sp_ad ...

  10. 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)

    1  HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...