2

I have implemented this for date range selection.

How do I restrict the limit of the date range. I want the user to select max of seven days from the start date selected.

enter image description here

Adding my code below,

private fun showDateRangePicker() {
    val constraintsBuilder = CalendarConstraints.Builder()
    val validators: ArrayList<CalendarConstraints.DateValidator> = ArrayList()
    validators.add(DateValidatorPointBackward.before(MaterialDatePicker.todayInUtcMilliseconds()))
    validators.add(DateValidatorWeekdays())
    constraintsBuilder.setValidator(CompositeDateValidator.allOf(validators))

    val dateRangePicker =
            MaterialDatePicker.Builder.dateRangePicker()
                    .setTitleText("Select dates")
                    .setTheme(R.style.MaterialCalendarTheme)
                    .setSelection(Pair(MaterialDatePicker.todayInUtcMilliseconds(), MaterialDatePicker.todayInUtcMilliseconds()))
                    .setCalendarConstraints(constraintsBuilder.build())
                    .build()
    dateRangePicker.show(supportFragmentManager, dateRangePicker.toString())
}
Gabriele Mariotti
  • 320,139
  • 94
  • 887
  • 841
hasan_shaikh
  • 1,434
  • 1
  • 15
  • 38

1 Answers1

2

All the built-in validators provided by the library are static.
It is not perfect but you can define a custom Validator like:

public class RangeDateValidator implements CalendarConstraints.DateValidator {

    private MaterialDatePicker rangePicker;
    final int numberOfDays;

    public RangeDateValidator (int numberOfDays){
        this.numberOfDays = numberOfDays;
    }

    public void setDatePicker(MaterialDatePicker rangePicker) {
        this.rangePicker = rangePicker;
    }

    @Override
    public boolean isValid(long date) {
        Pair<Long, Long> selection =(Pair<Long, Long>) rangePicker . getSelection ();
        if (selection != null) {
            Long startDate = selection . first;
            if (startDate != null) {
                long days =(numberOfDays - 1) * TimeUnit.DAYS.toMillis(1);;
                if (date > startDate + days)
                    return false;
                if (date < startDate)
                    return false;
            }
        }
        return true;
    }
}

and then:

    val dateRangePickerBuilder =
        MaterialDatePicker.Builder.dateRangePicker()

    val constraintsBuilderRange = CalendarConstraints.Builder()
    val dateValidator = RangeDateValidator(7) //number of days
    constraintsBuilderRange.setValidator(dateValidator)
    dateRangePickerBuilder.setCalendarConstraints(constraintsBuilderRange.build())

    val datePicker = dateRangePickerBuilder.build()
    dateValidator.setDatePicker(datePicker)
    datePicker.show(supportFragmentManager, datePicker.tag)

enter image description here

Gabriele Mariotti
  • 320,139
  • 94
  • 887
  • 841