解决DatePickerDialog控件取消按钮有关问题

昨天测试上报了一条bug,内容大概为:在小米2手机中点击生日弹出DatePickerDialog后,修改日期,不点击完成,点击返回键,会修改TextView中的日期。

经过分析,代码当中我把处理日期的判断逻辑放在了OnDateSetListener监听的onDateSet()回调方法,当逻辑判断通过,就会修改的TextView当中的日期,这说明当我们点击返回键的时候会调用到onDateSet()回调方法。

但是DatePickerDialog提供的方法当中并没有直接控制点击返回键的方法,我是怎么处理的呢?

我最早的想法就是利用DatePickerDialog中提供的setButton方法,设置为一个确定,一个取消两个按键,但是这无疑当中添加很多的代码量,和逻辑处理。

有没有更方便,更简单的方法呢?有的,继承DatePickerDialog重写生命周期方法onStop()。



  1.     class MyDatePickerDialog extends DatePickerDialog {

  2.         public MyDatePickerDialog(Context context, OnDateSetListener callBack,
  3.                 int year, int monthOfYear, int dayOfMonth) {
  4.             super(context, callBack, year, monthOfYear, dayOfMonth);
  5.         }
  6.         @Override
  7.         protected void onStop() {
  8.             //super.onStop();
  9.         }
  10.     }
复制代码


细心的同学肯定看到我注释掉了,super.onStop(),为什么注释掉这个方法就能达到返回键不调用onDateSet方法呢?
DatePickerDialog 源码当中,onStop()生命周期当中,会调用tryNotifyDateSet();



  1. @Override
  2.     protected void onStop() {
  3.         tryNotifyDateSet();
  4.         super.onStop();
  5.     }
复制代码


tryNotifyDateSet();通过方法名,大家也看到了,他是通知onDateSet()方法,这说明当DatePickerDialog 生命周期到onStop()的时候会调用到onDateSet。tryNotifyDateSet()方法如下:



  1. private void tryNotifyDateSet() {
  2.         if (mCallBack != null) {
  3.             mDatePicker.clearFocus();
  4.             mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
  5.                     mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
  6.         }
  7.     }
复制代码


这也就解释了为什么我在重写当中注释掉super方法,而达到了目的。
再一个,为了避免重复造轮,我事先搜索过,还没有解释该问题文章,所以就发上来了,如果有不对的地方,恳请大家指教。





原文作者: Kenneth_Yo

原文地址: http://my.eoe.cn/786272/archive/4091.html


注释:亲测有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值