本文主要讲两个内容: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. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...

  2. office2013发布博客

    0, 喜欢用world记笔记,并查上一些配图.但是再想重新发到博客上,图片不得不重新上传十分蛋疼. world直接发布博客功能太棒了,直接绑定账号和url就可以发送了,爽YY!!! 1,新建一个博客文 ...

  3. JavaScript jQuery 入门回顾

    ​$符号 $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名: window.jQuery; // j ...

  4. google map 点与点画线

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. [译]GC专家系列1: 理解Java垃圾回收

    原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原 ...

  6. 完美解决IE6中fixed抖动问题的方法

    我们可以通过position:fixed来实现元素的固定效果,如网页中底部的"回到顶部菜单",底部的toolbar,对联广告等等,可惜fixed属性在IE6及以下是不支持的.通常的 ...

  7. gc overhead limit exceeded

    eclipse-- gc overhead limit exceeded 修改内存不足的方法如下: Eclipse报错:gc overhead limit exceeded eclipse 原因是Ec ...

  8. Linux下vsftp服务器—上传、下载

    一.  FTP 说明 Linux下常用的FTP Server是vsftp(Very Security File Transfer Protocol),及profpt(Professtional ftp ...

  9. 安装Nuget上常用的包的命令

    起因: Nuget图形化操作界面各种卡顿,或者有时干脆就连不上了.所以用命令还是很必须的. 常用命令: 安装 Entity Framework : PM> Install-Package Ent ...

  10. 2016 系统设计第一期 (档案一)MVC 引用 js css

    @Styles.Render("~/Bootstrap/css/bootstrap-theme.css") @Scripts.Render("~/jQuery/jquer ...