关于DatePickerDialog点击返回键取消调用回调方法onDateSet()的解决办法

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    class MyDatePickerDialog extends DatePickerDialog {

        public MyDatePickerDialog(Context context, OnDateSetListener callBack,
                int year, int monthOfYear, int dayOfMonth) {
            super(context, callBack, year, monthOfYear, dayOfMonth);
        }
        @Override
        protected void onStop() {
            //super.onStop();
        }
    }

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

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

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

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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值