Android DatePicker показывает недоступные месяцы при использовании пределов min/max - программирование

Android DatePicker показывает недоступные месяцы при использовании пределов min/max

Я нашел только один экземпляр этой проблемы в StackOverflow, который был без ответа (в прошлом году), поэтому я решил, что дам еще один снимок. (Android DatePicker/Dialog отображает неправильные месяцы/с использованием минимальной/максимальной даты, с фактическим изображением)

При настройке minDate и maxDate в Android DatePicker будут показаны месяцы, которые недоступны в пределах диапазона min и max. Я продемонстрирую эту проблему со следующими изображениями:

Когда я нахожусь в minDate:

When I'm at minDate

Когда я между датами:

In between dates

Когда я нахожусь в maxDate:

At maxDate

Недоступные месяцы (в этом случае апрель и июнь) действуют как минимальные и максимальные значения в этой ситуации, поэтому, отправляясь в апреле, DatePicker будет снимать до 15 мая, или попытка сместить до июня переместит DatePicker на 22 мая.

Возможно ли сохранить эти (недоступные) месяцы скрытыми от просмотра, поэтому в этом тестовом случае единственной выбираемой частью будет дата? Также, имея в виду, что с интервалом между, например, 29 мая и 5 июня, июнь должен появиться в списке.

4b9b3361

Ответ 1

ВАРИАНТ 1. Вы можете использовать android-times-square

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

Calendar nextYear = Calendar.getInstance();
nextYear.add(Calendar.YEAR, 1);

CalendarPickerView calendar = (CalendarPickerView) findViewById(R.id.calendar_view);
Date today = new Date();
calendar.init(today, nextYear.getTime())
    .inMode(RANGE);

Ответ 2

Я исправил эту проблему, сбросив текущее время до полуночи:

Calendar date = Calendar.getInstance();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
datePicker.setMaxDate(date.getTimeInMillis());