在 Android DatePicker 自定义对话框中限制范围 [英] Restrict Range in Android DatePicker Custom Dialog
问题描述
我有一个自定义的线性布局,其中包含 DatePicker
和 TimePicker
小部件.这用作 DateTime
选择器.我想通过 setMaxDate()
和 setMinDate()
来限制 DatePicker.我已经完成了:
dp.setMaxDate(new DateTime().minusDays(1).getMillis());dp.setMinDate(new DateTime().minusDays(30).getMillis());
当对话框出现时,超出此范围的日期实际上是灰色的.但我仍然可以选择一个灰色的日期.我偶然发现了
<小时>步骤
1.将材料依赖添加到模块的 gradle 文件中
实现'com.google.android.material:material:1.1.0-beta01'
2.更改应用主题以从 Material 主题版本继承.
例如:
3.使用以下代码启动对话框.
class MainActivity : AppCompatActivity() {覆盖 fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)setupRangePickerDialog()}私人乐趣 setupRangePickerDialog() {val builderRange = MaterialDatePicker.Builder.dateRangePicker()builderRange.setCalendarConstraints(limitRange().build())val pickerRange = builderRange.build()pickerRange.show(supportFragmentManager,pickerRange.toString())}/*将可选择范围限制为 2019 年 10 月 17 日至 11 月 20 日*/私人乐趣 limitRange(): CalendarConstraints.Builder {val 约束BuilderRange = CalendarConstraints.Builder()val calendarStart: Calendar = GregorianCalendar.getInstance()val calendarEnd: Calendar = GregorianCalendar.getInstance()val 年 = 2019calendarStart.set(year, 10, 17)calendarEnd.set(year, 11, 20)val minDate = calendarStart.timeInMillisval maxDate = calendarEnd.timeInMillisConstraintBuilderRange.setStart(minDate)ConstraintBuilderRange.setEnd(maxDate)ConstraintBuilderRange.setValidator(RangeValidator(minDate, maxDate))返回约束BuilderRange}}类 RangeValidator(private val minDate:Long, private val maxDate:Long) : CalendarConstraints.DateValidator{构造函数(包裹:包裹):这个(包裹.readLong(),包裹.readLong())覆盖 fun writeToParcel(dest: Parcel?, flags: Int) {TODO("未实施")}覆盖 fun describeContents(): Int {TODO("未实施")}覆盖乐趣 isValid(date: Long): Boolean {返回 !(minDate > date || maxDate < date)}伴随对象 CREATOR : Parcelable.Creator{覆盖乐趣 createFromParcel(parcel: Parcel): RangeValidator {返回 RangeValidator(包裹)}覆盖 fun newArray(size: Int): Array{返回数组空值(大小)}}}
I have a custom linear layout which has DatePicker
and TimePicker
widgets in it. This is used as DateTime
picker. I want to restrict the DatePicker by way of setMaxDate()
and setMinDate()
. I have done:
dp.setMaxDate(new DateTime().minusDays(1).getMillis());
dp.setMinDate(new DateTime().minusDays(30).getMillis());
The dates beyond this range are actually grayed out when the dialog appears. But I can still select a grayed date. I have stumbled upon this. But, what is the work around for a custom layout with datepicker in it?
For future readers!
Actually with new android material design components what you want achieve could be achieved using MaterialDatePicker
. And dates outside the allowed range is not selectable.
Steps
1. Add material dependency to your module's gradle file
implementation 'com.google.android.material:material:1.1.0-beta01'
2. Change app theme to inherit from a version of material theme.
ex:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
3. Use following code to initiate the dialog.
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 DatePicker 自定义对话框中限制范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!