完全参照系统自带的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. Enum枚举 简单的使用

    在枚举中使用抽象方法 /** * 为枚举类定义一个抽象方法,<br/> * 这个抽象方法由不同的枚举值提供不同的实现 * * @author wangzhu * @date 2014-9- ...

  2. 2.Sprng-IoC-Java反射例子

    1.Car.java package com.jike.spring.chapter03.reflect; public class Car { private String brand; priva ...

  3. .md文件 Markdown 语法说明

    Markdown 语法说明 (简体中文版) / (点击查看快速入门) 概述 宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 ...

  4. [iOS]修改开发者中心Bundle Identifier的一些配置

    登录开发者中心https://developer.apple.com 然后找到你的Bundle Identifier. 这里暂时只讲开启推送的功能,如果需要别的直接勾选前面的选择框 然后拉到最下面点击 ...

  5. android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊。

    android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊. http://zhidao.baidu.com/link?url=mUI11 ...

  6. 07-语言入门-07-A Famous Music Composer

    题目地址: http://blog.csdn.net/sevenmit/article/details/8231994  描述 Mr. B is a famous music composer. On ...

  7. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...

  8. CentOS5.5 正式开始安装 Oracle 11g r2(图形界面安装)

    一.下载oracle 官方网站, 可以下载最新版本 Oracle Database 11g Release http://www.oracle.com/index.html CentOS5. i386 ...

  9. 函数os_file_pread

    /*******************************************************************//** Does a synchronous read ope ...

  10. 让IE6下支持固定定位

    让IE下支持固定定位 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...