完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog。具有同时选择日期、时间的功能。
在2.2、2.3平台,显示的效果可能会有一个大背景框在后面。4.0以上平台无此现象。此怪异效果通过各种手段未能解决。功能不影响正常使用。

import java.util.Calendar;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.LinearLayout;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener; /**
* 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog。具有同时选择日期、时间的功能。<br>
* 在2.2、2.3平台,显示的效果可能会有一个大背景框在后面。4.0以上平台无此现象。怪异的原因未能解决。
* @author AsionTang
* @since 2014年2月26日 17:02:24
*/
public class DateTimePickerDialog extends AlertDialog implements OnClickListener, OnDateChangedListener, OnTimeChangedListener
{
private final OnDateTimeChangedListener mCallback; private final DatePicker mDatePicker; private final TimePicker mTimePicker; private static final String HOUR = "hour"; private static final String MINUTE = "minute"; private static final String IS_24_HOUR = "is24hour"; private static final String YEAR = "year"; private static final String MONTH = "month"; private static final String DAY = "day"; private final Calendar mCalendar; public DateTimePickerDialog(final Context context, final int theme, final OnDateTimeChangedListener callBack)
{
super(context, theme);
this.mCallback = callBack;
this.mCalendar = Calendar.getInstance();
this.updateTitle(); this.setButton(BUTTON_POSITIVE, context.getText(android.R.string.ok), this);
this.setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel), (OnClickListener) null); this.mDatePicker = new DatePicker(context);
this.mDatePicker.init(this.mCalendar.get(Calendar.YEAR), this.mCalendar.get(Calendar.MONTH), this.mCalendar.get(Calendar.DAY_OF_MONTH), this); this.mTimePicker = new TimePicker(context);
this.mTimePicker.setIs24HourView(true);
this.mTimePicker.setCurrentHour(this.mCalendar.get(Calendar.HOUR_OF_DAY));
this.mTimePicker.setCurrentMinute(this.mCalendar.get(Calendar.MINUTE));
this.mTimePicker.setOnTimeChangedListener(this); final LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);//默认为HORIZONTAL(水平)
linearLayout.setGravity(Gravity.CENTER);
linearLayout.addView(this.mDatePicker);
linearLayout.addView(this.mTimePicker);
this.setView(linearLayout);
} public DateTimePickerDialog(final Context context, final OnDateTimeChangedListener callBack)
{
this(context, 0, callBack);
} /**
* Gets the {@link DatePicker} contained in this dialog.
*
* @return The DatePicker view.
*/
public DatePicker getDatePicker()
{
return this.mDatePicker;
} /**
* Gets the {@link TimePicker} contained in this dialog.
*
* @return The TimePicker view.
*/
public TimePicker getTimePicker()
{
return this.mTimePicker;
} @Override
public void onClick(final DialogInterface dialog, final int which)
{
this.tryNotifyDateTimeSet();
} @Override
public void onDateChanged(final DatePicker view, final int year, final int month, final int day)
{
this.mDatePicker.init(year, month, day, this); this.mCalendar.set(Calendar.YEAR, year);
this.mCalendar.set(Calendar.MONTH, month);
this.mCalendar.set(Calendar.DAY_OF_MONTH, day); this.updateTitle();
} @Override
public void onRestoreInstanceState(final Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
final int year = savedInstanceState.getInt(YEAR);
final int month = savedInstanceState.getInt(MONTH);
final int day = savedInstanceState.getInt(DAY);
this.mDatePicker.init(year, month, day, this); final int hour = savedInstanceState.getInt(HOUR);
final int minute = savedInstanceState.getInt(MINUTE);
this.mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
this.mTimePicker.setCurrentHour(hour);
this.mTimePicker.setCurrentMinute(minute);
} @Override
public Bundle onSaveInstanceState()
{
final Bundle state = super.onSaveInstanceState();
state.putInt(YEAR, this.mDatePicker.getYear());
state.putInt(MONTH, this.mDatePicker.getMonth());
state.putInt(DAY, this.mDatePicker.getDayOfMonth()); state.putInt(HOUR, this.mTimePicker.getCurrentHour());
state.putInt(MINUTE, this.mTimePicker.getCurrentMinute());
state.putBoolean(IS_24_HOUR, this.mTimePicker.is24HourView()); return state;
} @Override
public void onTimeChanged(final TimePicker view, final int hourOfDay, final int minute)
{
this.mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
this.mCalendar.set(Calendar.MINUTE, minute);
} public void setDate(final int year, final int monthOfYear, final int dayOfMonth)
{
this.mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
} public void setDateAndTime(final int year, final int monthOfYear, final int dayOfMonth, final int hour, final int minute,
final boolean is24HourView)
{
this.setDate(year, monthOfYear, dayOfMonth);
this.setTime(hour, minute, is24HourView);
} public void setTime(final int hour, final int minute, final boolean is24HourView)
{
this.mTimePicker.setIs24HourView(is24HourView);
this.mTimePicker.setCurrentHour(hour);
this.mTimePicker.setCurrentMinute(minute);
} private void tryNotifyDateTimeSet()
{
if (this.mCallback != null)
{
this.mDatePicker.clearFocus();
this.mTimePicker.clearFocus();
this.mCallback.onDateTimeChanged(this.mDatePicker, this.mTimePicker//
, this.mDatePicker.getYear(), this.mDatePicker.getMonth(), this.mDatePicker.getDayOfMonth()//
, this.mTimePicker.getCurrentHour(), this.mTimePicker.getCurrentMinute());
}
} private void updateTitle()
{
final String title = DateUtils.formatDateTime(this.getContext(), this.mCalendar.getTimeInMillis()//
, DateUtils.FORMAT_SHOW_DATE//
| DateUtils.FORMAT_NO_YEAR//
| DateUtils.FORMAT_SHOW_WEEKDAY);
this.setTitle(title);
} public interface OnDateTimeChangedListener
{
void onDateTimeChanged(DatePicker dateView, TimePicker timeView, int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minute);
}
}

完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog的更多相关文章

  1. Notepad2替代系统自带的记事本

    事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢:但今天复制的内容中有很多数字和一些我不想要的内 ...

  2. 如何获取安卓系统自带应用的package和activity

    之前在做appium自动化测试的时候,参考网上的例子,运行安卓系统自带的app,所以,就需要获取系统自带的package(包名)和activity.这里简单记录一下,不一定适合所有的系统应用. 运行环 ...

  3. 重装系统后如何删除系统自带的office2003

    背景:操作系统重装后,系统自带的office2003版本太低不好使用,需要安装更高版本的如2010,但是卸载时提示“无法打开此修补程序包……”,从而无法卸载.经网上查询,采用以下解决办法: 在注册表中 ...

  4. C语言中使用系统自带的快排函数

    题目 . 德才论 () 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取 ...

  5. Ios二维码扫描(系统自带的二维码扫描)

    Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...

  6. Broadcom有线网卡在Windows 8/8.1/10下使用系统自带驱动会断网的解决办法

    出处:qiuyi21.cnblogs.com 1.下载最新正式版驱动程序 上Broadcom官方网站http://www.broadcom.com/support/ethernet_nic/downl ...

  7. Android去掉listView,gridView等系统自带阴影

    当我们使用listView的时候,拉到顶,或是拉到底部的时候,我们会发现有系统自带的阴影效果出现,不同手机出现的颜色可能还会不一样. 在以前我始终都有注意到此问题,一直以为是系统自带的,不能去掉.也没 ...

  8. Android调用系统自带的设置界面

    Android有很多系统自带的设置界面,如设置声音,设置网络等. 在开发中可以调用这些系统自带的设置界面. 点击以下列表中的选项,就可以调出相应的系统自带的设置界面. 如点击“无线和网络设置”,可以调 ...

  9. 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)

    应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...

随机推荐

  1. 解决 Ubuntu 开机 Waiting for 60 seconds more for network configuration

    sudo vim /etc/network/interfaces, 将该文件的内容修改为如下:(也就是说删掉其他的什么auto eth0.auto wlan0) auto lo iface lo in ...

  2. lintcode :链表插入排序

    题目: 链表插入排序 用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null 解题: ...

  3. Java学习笔记之:Java数据类型的转换

    一.介绍 数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转换顺序不受 ...

  4. PCB板的价格是怎么算出来的?

    Part 1 :影响一块PCB板价格的各种因素 PCB的价格是很多采购者一直很困惑的事情,很多人在线下单时也会疑问这些价格是怎么算出来的,下面我们就一起谈论一下PCB价格的组成因素. 1.PCB所用材 ...

  5. OSSEC配置文件ossec.conf中添加mysql服务

    配置路径:/opt/ossec/etc/ossec.conf <ossec_config>   <global>     <email_notification>y ...

  6. cololection

    package cn.bjsxt.col; /** * 简化迭代器原理 * hasNext * next * @author Administrator * */ public class MyArr ...

  7. Android移动应用开发中常见的经验技巧总结

    转:http://wwwdevstorecn/essay/essayInfo/6128.html 1. 对话保持的解决方案. 要求: 1.app中使用webview访问具体网站的内容,但是app与服务 ...

  8. devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  9. hdu 1243 反恐训练营(dp 最大公共子序列变形)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243 d[i][j] 代表第i 个字符与第 j 个字符的最大的得分.,, 最大公共子序列变形 #inclu ...

  10. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...