使用LocalDate而不是Day Month Year的DatepickerDialog

时间:2018-08-10 07:29:50

标签: android datepickerdialog jsr310

我正在尝试创建一个自定义DatePickerDialog类,它将触发onDateSet侦听器回调,但是我想重载而不是包含“ Day”,“ Month”和“ year”值构造函数以包含来自java.time的LocalDate。我知道我可以互相转换值,但是出于学习目的,我想直接这样做。

我以前从未扩展/重载Android类,所以我不确定该采取哪些步骤。
我试图创建一个扩展CustomDatePickerDialog的{​​{1}}类,但是默认构造函数仍必须包含super-Constructor,因此对我没有太大帮助。

另一个想法是,我可以将Android类(DatePickerDialog)复制到本地应用程序中,在其中更改名称和构造函数,然后使用新的本地类。问题是,我找不到DatePickerDialog的源代码(或与此有关的任何类)。我也觉得这是解决问题的一种回旋方式。

更改扩展默认android类的自定义类的构造方法的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

类似(未经测试)

public class CustomDatePickerDialog extends DatePickerDialog {

    public static interface CustomOnDateSetListener {
        void onDateSet(DatePicker view, LocalDate date);
    }

    public CustomDatePickerDialog(Context context,
            CustomOnDateSetListener listener, LocalDate date) {
        super(context, adaptListener(listener),
                date.getYear(), date.getMonthValue() - 1, date.getDayOfMonth());
    }

    private static OnDateSetListener adaptListener(CustomOnDateSetListener customListener) {
        return new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                customListener.onDateSet(view, LocalDate.of(year, month + 1, dayOfMonth);
            }
        }
    }

}

最复杂的部分是自定义侦听器。我正在为此声明一个新接口。我们需要将老式的DatePickerDialog.OnDateSetListener传递给超类,因此在adaptListener中,我正在构建一个在调用时将调用转发给侦听器并将其作为参数传递给构造函数的方法。