在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。更改应用程序主题以从实质主题的版本继承。
ex:
< style name = AppTheme parent = Theme.MaterialComponents.Light.NoActionBar>
3。使用以下代码启动对话框。
class MainActivity:AppCompatActivity(){
重写乐趣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日
* /
private fun limitRange():CalendarConstraints.Builder {
valconstraintsBuilderRange = CalendarConstraints.Builder()
val日历开始时间:日历= GregorianCalen dar.getInstance()
val calendarEnd:日历= GregorianCalendar.getInstance()
val year = 2019
calendarStart.set(year,10,17)
calendarEnd.set(year,11,20)
val minDate = calendarStart.timeInMillis
val maxDate = calendarEnd.timeInMillis
约束BuilderRange.setStart(minDate )
constraintsBuilderRange.setEnd(maxDate)
约束BuilderRange.setValidator(RangeValidator(minDate,maxDate))
返回约束BuilderRange
}
}
class RangeValidator(priv val minDate:Long,private val maxDate:Long):CalendarConstraints.DateValidator {
构造函数(包裹:包裹):this(
parcel.readLong(),
parcel.readLong()
)
重写fun writeToParcel(dest:Parcel ?,标志: Int){
TODO(未实施)
}
重写fun describeContents():整数{
TODO(未实现)
}
重写fun isValid(date:Long):布尔值{
return!( minDate>日期|| maxDate< date)
}
伴随对象CREATOR:Parcelable.Creator< RangeValidator> {
重写fun createFromParcel(parcel:Parcel):RangeValidator {
return RangeValidator(parcel)
}
重写fun newArray(size:Int):Array&RangeValidator ?> {
return arrayOfNulls(size)
}
}
}
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屋!