MaterialDatePicker Выберите дату только между 2 датами - PullRequest
1 голос
/ 19 июня 2020

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

val constraintBuilder = CalendarConstraints.Builder()
    val materialRangeBuilder = MaterialDatePicker.Builder.datePicker()
    materialRangeBuilder.setTitleText("Book Date")
    materialRangeBuilder.setCalendarConstraints(constraintBuilder.build())

    val materialRangePicker = materialRangeBuilder.build()

    materialRangePicker.addOnPositiveButtonClickListener {
        Timber.d("$it")
    }

    materialRangePicker.show(supportFragmentManager, "DATE_RANGE_PICKER")

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Вы можете использовать DateValidator, чтобы ограничить выбор.
В частности, вы можете использовать встроенные валидаторы:

  • DateValidatorPointForward , который включает даты от заданной точки вперед
  • DateValidatorPointBackward, который включает только даты до заданной точки.

Примерно:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();

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

//....define min and max for example with LocalDateTime and ZonedDateTime or Calendar

CalendarConstraints.DateValidator dateValidatorMin = DateValidatorPointForward.from(min.getTimeInMillis());
CalendarConstraints.DateValidator dateValidatorMax = DateValidatorPointBackward.before(max.getTimeInMillis());

ArrayList<CalendarConstraints.DateValidator> listValidators =
            new ArrayList<CalendarConstraints.DateValidator>();
listValidators.add(dateValidatorMin);
listValidators.add(dateValidatorMax);
CalendarConstraints.DateValidator validators = CompositeDateValidator.allOf(listValidators);
constraintsBuilderRange.setValidator(validators);

builder.setCalendarConstraints(constraintsBuilderRange.build());

MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());

enter image description here

1 голос
/ 12 июля 2020

@ GabrieleMariotti ответ хорош, но класса DateValidatorPointBackwards нет в библиотеке материального дизайна до версии 1.2. Если вы хотите выбрать между двумя датами и у вас есть библиотека материального дизайна версии 1.1 или более ранней, вы можете сделать это следующим образом:

val datePickerBuilder = MaterialDatePicker.Builder.datePicker()
datePickerBuilder.setCalendarConstraints(
    CalendarConstraints.Builder()
        .setValidator(object : CalendarConstraints.DateValidator {
            override fun isValid(date: Long): Boolean {
                return date >= startDate && date < endDate
            }

            override fun writeToParcel(p0: Parcel?, p1: Int) {}

            override fun describeContents(): Int {return 0}
        }).build()
)
val datePicker = datePickerBuilder.build()
datePicker!!.show(fragmentManager, "date picker")

, где startDate и endDate - длинные значения

0 голосов
/ 19 июня 2020

Используйте эти два метода.

public void setMinDate (long minDate)
public void setMaxDate (long maxDate)

Вот официальная документация. https://developer.android.com/reference/android/widget/DatePicker#setMaxDate (длинный)

Пример

val calender = Calendar.getInstance()
val year = calender.get(Calendar.YEAR)
val month = calender.get(Calendar.MONTH)
val day = calender.get(Calendar.DAY_OF_MONTH)
materialRangeBuilder.setMinDate(calender.getTimeInMillis())
materialRangeBuilder.setMaxDate(calender.getTimeInMillis())
...