やりたい事
MaterialDatePickerで日付を選択するとき、デフォルトでは過去/未来含めて全ての日付が選択できる。
ここで、「未来日は選択させたくない」という要件が出てきたとき、選択日に制限を加える必要がある。
解決方法
DateValidator
で制限を作成して、MaterialDatePickerのCalendarConstraints
にセットする。
MaterialDatePicker.Builder.datePicker().apply {
// 未来を選択させない制限
val dateValidatorMax = DateValidatorPointBackward.before(Date().time)
// 開始日を制限したいなら DateValidatorPointForward を使う
// val dateValidatorMin = DateValidatorPointForward.from(指定日)
// 制限Listを作成
val validators: List<DateValidator> = listOf(dateValidatorMax)
val dateValidator: DateValidator = CompositeDateValidator.allOf(validators)
// CalendarConstraintsを作成
val constraints: CalendarConstraints = CalendarConstraints.Builder()
.setValidator(dateValidator) // 制限をセット
.build()
setCalendarConstraints(constraints)
}.build().apply {
// OKクリック
addOnPositiveButtonClickListener { datetime ->
val date: String = SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN).format(datetime)
Log.d(TAG,date)
}
}.show(childFragmentManager, "MaterialDatePicker")
修正後スクショ
環境
implementation 'com.google.android.material:material:1.3.0-rc01'
感想
公式にあまり情報がなくて、StackOverFlowに助けられた。
もっとMaterial Design Componentsを使ってほしいなら、公式ドキュメント&サンプルを充実させてほしい。