【问题标题】:DatepickerDialog with LocalDate instead of Day Month Year使用 LocalDate 而不是日月年的 DatepickerDialog
【发布时间】:2019-01-17 18:14:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android datepickerdialog jsr310


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多