在Android DatePicker自定义对话框中限制范围 [英] Restrict Range in Android DatePicker Custom Dialog

查看:218
本文介绍了在Android DatePicker自定义对话框中限制范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义线性布局,其中包含 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆