昨天测试上报了一条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方法,而达到了目的。
再一个,为了避免重复造轮,我事先搜索过,还没有解释该问题文章,所以就发上来了,如果有不对的地方,恳请大家指教。