2

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

我以前从未扩展/重载过 Android 类,所以我不确定要采取哪些步骤。
我试图创建一个CustomDatePickerDialog扩展的类DatePickerDialog,但默认构造函数仍必须包含超级构造函数,所以这对我没有帮助。

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

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

4

1 回答 1

2

类似的东西(未测试)

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我正在构建一个在调用时将调用转发给然后作为参数传递给构造函数的监听器。

于 2018-09-25T16:08:28.183 回答