android - 在 Android DatePicker 自定义对话框中限制范围

标签 android datepicker material-components-android android-datepicker material-components

我有一个自定义的线性布局,它有 DatePickerTimePicker里面的小部件。这用作 DateTime选择器。我想通过 setMaxDate() 限制 DatePicker和 setMinDate() .我已经做好了:

dp.setMaxDate(new DateTime().minusDays(1).getMillis());
dp.setMinDate(new DateTime().minusDays(30).getMillis());

当对话框出现时,超出此范围的日期实际上是灰色的。但我仍然可以选择一个灰色的日期。我偶然发现了this .但是,其中包含 datepicker 的自定义布局的解决方法是什么?

最佳答案

给 future 的读者!

居然用新的android material design components您想要达到的目标可以使用 MaterialDatePicker 来实现.超出允许范围的日期是不可选择的。

restricted datepicker range

步骤

1. 将 Material 依赖添加到模块的 gradle 文件

implementation 'com.google.android.material:material:1.1.0-beta01'

2.更改应用主题以继承 Material 主题的版本。

前任:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">

3. 使用以下代码启动对话框。
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setupRangePickerDialog()

    }

    private fun setupRangePickerDialog() {
        val builderRange = MaterialDatePicker.Builder.dateRangePicker()

        builderRange.setCalendarConstraints(limitRange().build())
        val pickerRange = builderRange.build()
        pickerRange.show(supportFragmentManager, pickerRange.toString())
    }


    /*
    Limit selectable range to Oct 17 - Nov 20 2019
     */
    private fun limitRange(): CalendarConstraints.Builder {

        val constraintsBuilderRange = CalendarConstraints.Builder()

        val calendarStart: Calendar = GregorianCalendar.getInstance()
        val calendarEnd: Calendar = GregorianCalendar.getInstance()

        val year = 2019

        calendarStart.set(year, 10, 17)
        calendarEnd.set(year, 11, 20)

        val minDate = calendarStart.timeInMillis
        val maxDate = calendarEnd.timeInMillis

        constraintsBuilderRange.setStart(minDate)
        constraintsBuilderRange.setEnd(maxDate)

        constraintsBuilderRange.setValidator(RangeValidator(minDate, maxDate))

        return constraintsBuilderRange
    }


}

class RangeValidator(private val minDate:Long, private val maxDate:Long) : CalendarConstraints.DateValidator{


    constructor(parcel: Parcel) : this(
        parcel.readLong(),
        parcel.readLong()
    )

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        TODO("not implemented")
    }

    override fun describeContents(): Int {
        TODO("not implemented")
    }

    override fun isValid(date: Long): Boolean {
        return !(minDate > date || maxDate < date)

    }

    companion object CREATOR : Parcelable.Creator<RangeValidator> {
        override fun createFromParcel(parcel: Parcel): RangeValidator {
            return RangeValidator(parcel)
        }

        override fun newArray(size: Int): Array<RangeValidator?> {
            return arrayOfNulls(size)
        }
    }

}

关于android - 在 Android DatePicker 自定义对话框中限制范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004398/

相关文章:

android - 使用 Android 直接读取/写入 SD 卡

android - 自定义 AppCompat 主题未更改旧设备上的溢出图标

安卓图库和适配器

java - 将自定义标记添加到 Android 中的 Google map

android - Material Design 扩展 float 操作按钮没有涟漪效应

jQuery Datepicker 月份变化的幻灯片效果

ios - swift 4中datePicker中月份列中的随机值

reactjs - react 日期选择器 shouldCloseOnSelect 不起作用

android - Theme.MaterialComponents 不会更改对话框标题的字体

android - 如何为自定义 TextInputLayout 设置默认样式