2

I am trying to create a simple DatePicker using MaterialDatePicker where future dates are disabled. I tried few answers from other similar StackOverflow questions but it didn't work. This is my code so far:-

val datePicker = MaterialDatePicker.Builder.datePicker().apply {
        setTitleText(getString(R.string.label_select_dob))
        setCalendarConstraints(limitRange().build())
    }.build()

 private fun limitRange(): CalendarConstraints.Builder {
    val calendarStart: Calendar = Calendar.getInstance()
    val calendarEnd: Calendar = Calendar.getInstance()
    val year = 1900
    val startMonth = 1
    val startDate = 1
    calendarStart.set(year, startMonth, startDate)
    calendarEnd.set(2021, 3, 27)
    val minDate: Long = calendarStart.timeInMillis
    val maxDate: Long = calendarEnd.timeInMillis

    val constraintsBuilder = CalendarConstraints.Builder()
    val validators: ArrayList<CalendarConstraints.DateValidator> = ArrayList()
    validators.add(DateValidatorPointForward.from(minDate))
    validators.add(DateValidatorPointBackward.before(maxDate))
    constraintsBuilder.setValidator(CompositeDateValidator.allOf(validators))

    return constraintsBuilder
}
Ankur Anand
  • 45
  • 1
  • 7
  • Does this answer your question? [Android datepicker min max date before api level 11](https://stackoverflow.com/questions/10836679/android-datepicker-min-max-date-before-api-level-11) – Ticherhaz FreePalestine Mar 27 '21 at 16:41
  • @Ticherhaz : No, those answers are for android.app library dialog. I am asking for com.google.android.material.datepicker library dialog – Ankur Anand Mar 27 '21 at 17:41

3 Answers3

7

To disable future dates just use the DateValidatorPointBackward provided by the library.

With today:

val constraintsBuilder =
    CalendarConstraints.Builder()
        .setValidator(
            DateValidatorPointBackward.now())

enter image description here

If you need a custom date (all dates after 1st April):

    val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
    calendar[Calendar.DAY_OF_MONTH] = 1
    calendar[Calendar.MONTH] = Calendar.APRIL
    val april = calendar.timeInMillis

    val constraintsBuilder =
        CalendarConstraints.Builder()
            .setValidator(
                DateValidatorPointBackward.before(april))
Gabriele Mariotti
  • 320,139
  • 94
  • 887
  • 841
2
val constraintsBuilder =
            CalendarConstraints.Builder()
                .setValidator(DateValidatorPointBackward.now())

val dataPicker = MaterialDatePicker.Builder.datePicker().apply {
            setTitleText("Select Previous Dates")
            setCalendarConstraints(constraintsBuilder.build())
        }.build()
0

First Create a Constraints Builder

 val constraintsBuilder = CalendarConstraints.Builder().setValidator(DateValidatorPointBackward.now())

Second Pass it to setCalendarConstraints method

val dialog1 = MaterialDatePicker.Builder.datePicker().setCalendarConstraints(constraintsBuilder.build())

Assign it to a variable and display

val picker = dialog1.build()
           
picker.show(adapter.getFragmentManager(), picker.toString())

For more information on Material Date Picker Library, you can visit the below link:

https://material.io/components/date-pickers/android

benson23
  • 16,369
  • 9
  • 19
  • 38