DatepickerDialog с LocalDate вместо Day Month Year

Я пытаюсь создать собственный класс DatePickerDialog, который будет запускать обратный вызов прослушивателя onDateSet, но вместо того, чтобы содержать значения «День», «Месяц» и «Год», я хочу перегрузить конструктор, чтобы он содержал LocalDate из java.time вместо этого . Я знаю, что могу преобразовывать значения друг в друга и обратно, но в учебных целях я хотел бы сделать это напрямую.

Я никогда раньше не расширял/не перегружал класс Android, поэтому не знаю, какие шаги предпринять.
Я пытался создать класс CustomDatePickerDialog, который расширяет DatePickerDialog, но конструктор по умолчанию все равно должен содержать суперконструктор. , так что это не очень помогает мне.

Еще одна мысль заключалась в том, что я мог бы скопировать класс Android (DatePickerDialog) в свое локальное приложение, изменить там имя и конструктор, а затем использовать свой новый локальный класс. Проблема заключалась в том, что я не мог найти исходный код для DatePickerDialog (или любых классов в этом отношении). Я также чувствую, что это своего рода обходной путь решения проблемы.

Каков наилучший способ изменить конструктор для пользовательского класса, который расширяет класс Android по умолчанию?


person fogx    schedule 10.08.2018    source источник


Ответы (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 я создаю тот, который при вызове перенаправляет вызов, а слушатель передается в конструктор в качестве аргумента.

person Ole V.V.    schedule 25.09.2018