MaterialDatePicker показывает текущую дату вместо необходимой - PullRequest
2 голосов
/ 07 мая 2020

Используя MaterialDatePicker Я хочу показать требуемую дату и дать возможность выбрать другую. Но когда появляется DatePicker, он показывает текущую дату вместо указанной.

Я подключаю библиотеку: implementation 'com.google.android.material:material:1.2.0-alpha06' (или 1.1.0).

Затем переопределите AppTheme в styles.xml:

<style name="AppTheme" parent="Theme.MaterialComponents.Light">

И теперь можете отображать DatePicker.

val now = Calendar.getInstance()
now[Calendar.YEAR] = 2020
now[Calendar.MONTH] = 10
now[Calendar.DAY_OF_MONTH] = 1
val builder = MaterialDatePicker.Builder.datePicker()
builder.setSelection(now.timeInMillis)

val picker = builder.build()
fragmentManager?.let { picker.show(it, MaterialDatePicker::class.java.simpleName) }

Это результат. Я хочу показать 1 ноября, но он показывает 7 мая.

enter image description here

ОБНОВЛЕНИЕ 1

Как написано в ссылке выше, мы можем используйте CalendarConstraints.Builder:

...
val constraintsBuilder = CalendarConstraints.Builder()
constraintsBuilder.setStart(now.timeInMillis)
constraintsBuilder.setEnd(now.timeInMillis)

val builder = MaterialDatePicker.Builder.datePicker()
builder.setCalendarConstraints(constraintsBuilder.build())
builder.setSelection(now.timeInMillis)
...

Это покажет требуемую дату, мы можем выбрать другой день, но мы не можем прокручивать месяцы.

enter image description here

UPDATE 2

Полагаю, это ошибка нового Android DatePicker. Поэтому я должен выбрать известную библиотеку https://github.com/wdullaer/MaterialDateTimePicker. Он выбирает указанную дату правильно и не требует изменения исходной темы.

enter image description here

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете установить месяц, до которого открывается сборщик, с помощью метода constraintsBuilder.setOpenAt(). Значение по умолчанию - текущий месяц, если в пределах, в противном случае - самый ранний месяц в пределах:

CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder();

LocalDateTime local = LocalDateTime.of(2020, 11, 1, 0, 0);
long openAt= local.atZone(ZoneId.ofOffset("UTC", ZoneOffset.UTC)).toInstant().toEpochMilli();
//you can also use Calendar.getInstance()...
constraintsBuilder.setOpenAt(openAt);

builder.setCalendarConstraints(constraintsBuilder.build());

Вы можете установить выбор по умолчанию (по умолчанию - нет выбора) с помощью:

builder.setSelection(....);

enter image description here

...