(一)在Android 4.0以上系统的某些手机(如本人的测试机红米Note(系统4.4.4),以及模拟器(系统4.0)),使用如下代码创建时间选择器时,页面效果如图:

Calendar cal = Calendar.getInstance();
DatePickerDialog dialog =new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener(){
@Override
publicvoid onDateSet(DatePicker view,int year,int monthOfYear,int dayOfMonth){
System.out.println("onDateSet~~onDateSet~~");
}
}, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));  

问题来了,对话框上没有“取消”按钮!而且,即使通过返回键或者点击空白区域关闭了对话框,onDateSet方法依然会被回调,也就是上述代码中的onDateSet~~onDateSet~~这个log依然会输出!

仔细测试后会发现,点击返回键或者空白区域以关闭对话框时,onDateSet会被回调一次;点击“完成”按钮时,onDateSet会被回调两次。奇葩!!!

后来又测试发现,这段代码在基于android 5.0的CM系统上是没有问题的:对话框上面有“完成”按钮和“取消”按钮,点击“完成”时onDateSet被回调一次,点击“取消”时onDateSet不会被回调。这才是最好的效果!

(二)其实,想在对话框上加一个取消按钮很简单,加上如下代码即可:

dialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",new DialogInterface.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
System.out.println("cancel~~cancel~~");
}
});     

然后效果图:

但是,问题并没有解决。因为即使点击取消按钮,onDateSet方法依然会被回调。也就是说,点击“取消”、点击手机返回键、点击空白区域这3种操作的结果是一样的!

(三)解决方案:

很简单,不使用OnDateSetListener,而直接手动设置“完成”按钮和“取消”按钮的事件。完整代码如下:

publicvoid pickDate(View view){
Calendar cal = Calendar.getInstance();
final DatePickerDialog mDialog =new DatePickerDialog(this,null,
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
//手动设置按钮
mDialog.setButton(DialogInterface.BUTTON_POSITIVE,"完成",new DialogInterface.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
//通过mDialog.getDatePicker()获得dialog上的DatePicker组件,然后可以获取日期信息
DatePicker datePicker = mDialog.getDatePicker();
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
System.out.println(year +","+ month +","+ day);
}
}); //取消按钮,如果不需要直接不设置即可
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",new DialogInterface.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
System.out.println("BUTTON_NEGATIVE~~");
}
});
mDialog.show();

来源:http://www.it165.net/pro/html/201503/36757.html

Android DatePickerDialog 使用方法的更多相关文章

  1. Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具

    Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...

  2. Android抓包方法(二)之Tcpdump命令+Wireshark

    Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...

  3. Android抓包方法(一)之Fiddler代理

    Android抓包方法(一) 之Fiddler代理 前言: 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等. 不管是之前做HTML5手机 ...

  4. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  5. [转]Android View.onMeasure方法的理解

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...

  6. Android编程: 调试方法

    学习知识:Android的调试方法 ====调试方法==== 前提: IDE环境为Android Studio,熟悉LogCat,知道如何查看日志信息 工具: Android DDMS调试工具,一般点 ...

  7. android图片压缩方法

    android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...

  8. 加速 Gradle 构建大型 Android 项目的方法[转]

    加速 Gradle 构建大型 Android 项目的方法 时间 2016-03-14 20:38:00  Mystra 原文  http://www.wangchenlong.org/2016/03/ ...

  9. Android界面刷新方法

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

随机推荐

  1. 【题解】Luogu P2787 语文1(chin1)- 理理思维

    原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计 ...

  2. Redis随笔-rename效率问题

    背景 rename是redis中给key重命名命令,rename key newkey的意思就是将key重命名为newkey.大部分文档在介绍rename的时候只将它描述成一个时间复杂度为O(1)的命 ...

  3. entry points

    https://amir.rachum.com/blog/2017/07/28/python-entry-points/

  4. Android之xml解析

    利用类下载器解析Xml文件要解析的xml文件<?xml version="1.0" encoding="utf-8"?><info> & ...

  5. phpstorm中设置代码上传到github

    参考: https://blog.csdn.net/Knight_quan/article/details/54894691 https://www.300168.com/biancheng/show ...

  6. 18种CSS3loading效果完整版

    今天把之前分享的两篇博客<CSS3实现10种Loading效果>和 <CSS3实现8种Loading效果[二]>整理了一下.因为之前所分享的各种loading效果都只是做了we ...

  7. Provinces of China

    https://en.wikipedia.org/wiki/Provinces_of_China#Province

  8. CF 1087解题报告

    cf解题报告 记录一下吧 做出:T1 rating :-97 想起几个月前做不出T1还是有点小搞笑呀2333 T1 双指针+特判 T2 发现k特别小,枚举剩余系 还要判断是否是能被n整除 移项发现可以 ...

  9. 【基本知识】Flume基本环境搭建以及原理

    系统:CentOS6.5JDK:1.8.0_144Flume:flume-ng-1.6.0-cdh5.12.0 一.什么是Flume flume 作为 cloudera 开发的实时日志收集系统,受到了 ...

  10. JQuery的ajax方法获取返回值得到了值还包含了不要的html源码 (Ajax相关知识)

    因为后台使用了response.Write():这个方法,当输出完了以后,没有结束掉会继续输出,所以需要用到response.End():这样问题就解决了 jquery的ajax 除了通过url传值, ...