完全参照系统自带的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. mac 下周期调度命令或脚本

    crontab 是在linux服务器上部署定时任务的方法 0 5 * * * /usr/bin/python /data/www/tools/mysql_backup.py cmd之前有5个项目要填, ...

  2. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

  3. React使用rAF动画介绍

    一. <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF ...

  4. NSRange

    int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...       ...

  5. Android 类似时间轴的实现

    想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android ...

  6. JBPM4 常用表结构

    JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表   一:资源库与运行时表结构 1.  JBPM4_DEPLOYMENT 流程定义表 2.  J ...

  7. [置顶] android 与JavaScript的互相调用

    1.html代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> ...

  8. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

    在部署的时候出现Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server ...

  9. [HDOJ3635]Dragon Balls(并查集,路径压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意:有n个龙珠,n个城市.初始状态第i个龙珠在第i个城市里.接下来有两个操作: T A B:把 ...

  10. C# 创建iis站点以及IIS站点属性,iis不能启动站点

    DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...