Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制Android DatePicker自定义对话框中的范围_Android_Datepicker_Material Components Android_Android Datepicker_Material Components - Fatal编程技术网

限制Android DatePicker自定义对话框中的范围

限制Android DatePicker自定义对话框中的范围,android,datepicker,material-components-android,android-datepicker,material-components,Android,Datepicker,Material Components Android,Android Datepicker,Material Components,我有一个自定义的线性布局,其中有DatePicker和TimePicker小部件。这用作日期时间选择器。我想通过setMaxDate和setMinDate来限制日期选择器。我已经做了: dp.setMaxDate(new DateTime().minusDays(1).getMillis()); dp.setMinDate(new DateTime().minusDays(30).getMillis()); 当对话框出现时,超出此范围的日期实际上变灰。但我仍然可以选择一个灰色的日期。我偶然发现

我有一个自定义的线性布局,其中有DatePicker和TimePicker小部件。这用作日期时间选择器。我想通过setMaxDate和setMinDate来限制日期选择器。我已经做了:

dp.setMaxDate(new DateTime().minusDays(1).getMillis());
dp.setMinDate(new DateTime().minusDays(30).getMillis());
当对话框出现时,超出此范围的日期实际上变灰。但我仍然可以选择一个灰色的日期。我偶然发现了。但是,使用datepicker的自定义布局的解决方案是什么呢?

面向未来的读者

事实上,使用MaterialDatePicker可以实现新的目标。并且不可选择超出允许范围的日期

台阶

一,。将材质相关性添加到模块的渐变文件中

二,。将应用程序主题更改为从材质主题的版本继承

例:

三,。使用以下代码启动该对话框


材质零部件库提供了。 您可以使用DateValidator来限制选择。 特别是,您可以使用内置验证器:

DateValidatorPointForward,启用从给定点向前的日期 DateValidatorPointBackward,仅启用给定点之前的日期。 比如:

MaterialDatePicker.Builder<Pair<Long, Long>> builderRange = MaterialDatePicker.Builder.dateRangePicker();
CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();

//....define min and max for example with LocalDateTime and ZonedDateTime or Calendar

CalendarConstraints.DateValidator dateValidatorMin = DateValidatorPointForward.from(min.getTimeInMillis());
CalendarConstraints.DateValidator dateValidatorMax = DateValidatorPointBackward.before(max.getTimeInMillis());

ArrayList<CalendarConstraints.DateValidator> listValidators =
            new ArrayList<CalendarConstraints.DateValidator>();
listValidators.add(dateValidatorMin);
listValidators.add(dateValidatorMax);
CalendarConstraints.DateValidator validators = CompositeDateValidator.allOf(listValidators);
constraintsBuilderRange.setValidator(validators);

builderRange.setCalendarConstraints(constraintsBuilderRange.build());
MaterialDatePicker<Pair<Long, Long>> pickerRange = builderRange.build();
pickerRange.show(getSupportFragmentManager(), pickerRange.toString());

如果有人想在上面发布RangeValidator,但代码较少:@Parcelize注释已添加

@Parcelize
internal class RangeValidator(
private var minDate: Long = 0,
private var maxDate: Long = 0) : DateValidator {

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

如果无法更改整个旧主题,则可以使用桥接主题:我们如何在XML布局文件中声明这一点?Eugene先生,您现在需要做的就是迁移到材质主题,并观看应用程序爆炸。即使是桥梁主题也无助于缓解交通事故。所有零件均应手动更换checked@Farid答案是关于带有MaterialDatePicker的验证器,而不是需要使用的主题。
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)
        }
    }

}
MaterialDatePicker.Builder<Pair<Long, Long>> builderRange = MaterialDatePicker.Builder.dateRangePicker();
CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();

//....define min and max for example with LocalDateTime and ZonedDateTime or Calendar

CalendarConstraints.DateValidator dateValidatorMin = DateValidatorPointForward.from(min.getTimeInMillis());
CalendarConstraints.DateValidator dateValidatorMax = DateValidatorPointBackward.before(max.getTimeInMillis());

ArrayList<CalendarConstraints.DateValidator> listValidators =
            new ArrayList<CalendarConstraints.DateValidator>();
listValidators.add(dateValidatorMin);
listValidators.add(dateValidatorMax);
CalendarConstraints.DateValidator validators = CompositeDateValidator.allOf(listValidators);
constraintsBuilderRange.setValidator(validators);

builderRange.setCalendarConstraints(constraintsBuilderRange.build());
MaterialDatePicker<Pair<Long, Long>> pickerRange = builderRange.build();
pickerRange.show(getSupportFragmentManager(), pickerRange.toString());
@Parcelize
internal class RangeValidator(
private var minDate: Long = 0,
private var maxDate: Long = 0) : DateValidator {

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