Как отключить прошлые даты в MaterialDatePicker?

 //Material Date Picker
private val calendar = Calendar.getInstance()
private val constraintsBuilder = CalendarConstraints.Builder().setStart(calendar.timeInMillis)
private val builder = MaterialDatePicker.Builder.datePicker()
private val picker = builder
    .setSelection(calendar.timeInMillis)
    .setInputMode(MaterialDatePicker.INPUT_MODE_CALENDAR)
    .setCalendarConstraints(constraintsBuilder.build())
    .build()

Я использую приведенный выше код, чтобы открыть метод setSelection календаря для выбора текущей даты, а setStart работает только для текущего месяца. Поэтому я не могу выбрать даты предыдущего месяца, но я все еще могу выбрать прошлые даты текущего месяца.

Если кто может мне помочь. Пожалуйста, дай мне знать. Спасибо.


person Deepak Rajput    schedule 23.04.2020    source источник


Ответы (2)


Вы можете создать свой собственный DateValidator или просто использовать DateValidatorPointForward, предоставленный библиотекой.

Что-то типа:

//Returns a DateValidator which enables days from {@code point}, in 
//UTC milliseconds, forward
CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(yourDate);
constraintsBuilder.setValidator(dateValidator);

введите описание изображения здесь

person Gabriele Mariotti    schedule 23.04.2020
comment
Я сделал это, но для меня это работает нормально, но я не могу выбрать текущую дату из вашего кода. также блокирует выбор текущей даты. - person Deepak Rajput; 24.04.2020
comment
1. Еще одна вещь, которую я хотел спросить, предположим, я выбрал следующий месяц даты, тогда я открываю календарь, чем эта дата выбрана, но календарь не прокручивается до этого месяца. Любая идея, как это сделать? 2. Если я изменяю экземпляр builder с datepicker() на daterangepicker(), он не берет тему по умолчанию и не открывает как диалоговое окно открывается в полноэкранном режиме. - person Deepak Rajput; 24.04.2020
comment
@DeepakRajput Ваш вопрос не так ясен. DateValidator — это способ включить/выключить даты. Какое значение вы используете в методе from? Какую версию библиотеки вы используете и какую тему используете в приложении? - person Gabriele Mariotti; 24.04.2020
comment
Я говорю, что ваш валидатор даты работает, но не позволяет мне выбрать текущую дату. Это позволяет мне выбирать со дня после текущей даты. Итак, предположим, что сегодня 24, тогда я не могу выбрать 24, я могу выбрать только из 25. - person Deepak Rajput; 24.04.2020
comment
@DeepakRajput Это зависит от значения, которое вы используете в методе from (в миллисекундах UTC). Если вам нужно проверить все даты›=, просто используйте dateValidator = DateValidatorPointForward.now(); - person Gabriele Mariotti; 24.04.2020

Вам нужно создать свой собственный DateValidator для этого. Включение/отключение даты зависит от того, возвращает ли DateValidator.isValid() значение true или false.

@Parcelize
class FutureDateValidator : CalendarConstraints.DateValidator {
    override fun isValid(date: Long): Boolean {
        return date > System.currentTimeMillis()
    }
}

А затем используйте этот валидатор как:

CalendarConstraints.Builder()
    .setValidator(FutureDateValidator())
    .build()
person Saurabh Thorat    schedule 23.04.2020
comment
То же самое происходит с вашим кодом, который не может выбрать текущую дату. - person Deepak Rajput; 24.04.2020