在日期选择器中设置最大日期时可以选择未来日期

Posted

技术标签:

【中文标题】在日期选择器中设置最大日期时可以选择未来日期【英文标题】:Able to choose future date when setting max date in datepicker 【发布时间】:2015-04-12 02:07:36 【问题描述】:

我的目标是使用 AppCompat v21 构建 API 级别 21。

它给了我一个漂亮的新日期选择器,它有一个意想不到的属性,允许我在使用 max date 设置时选择未来的日期

datePicker.setMaxDate(Calendar.getInstance().getTimeInMillis())

未来的日期显示为灰色,但我仍然可以选择其中任何一个。那是一个错误吗?我做错了吗?有没有办法阻止用户在日期选择器中选择未来的日期?

旧的 Holo 日期选择器在设置最大日期时不允许选择未来的日期。

更新:

虽然它不能在我的 Nexus 4 运行股票 5.0 上正常工作,但它在我的 Nexus 6 运行股票 android 5.1.1 上正常工作。也许这是 Android 5.0 中的一个错误,它在 5.1 中已修复?谁能确认一下?

【问题讨论】:

【参考方案1】:

所以回答我自己的问题:

我在 grepcode 中查看了 DatePickerCalendarDelegate.java 的 Android 源代码,特别是 public void setMaxDate(long maxDate) 的 Android 版本 5.0 和 5.1。

setMaxDate() 中 5.1 的新功能是

mDayPickerView.goTo(getSelectedDay(), false, true, true);

已改为:

mDayPickerView.setMaxDate(maxDate);

似乎他们在那里修复了它,这与我的观察一致,即它在 5.1 中按预期工作,但在 5.0 中没有。

因此,我们似乎一直在处理它在 Android 5.0 中无法正常工作的事实(最大日期后的天数显示为灰色,但仍然可以选择)。

【讨论】:

那我们该怎么办? 如果用户选择了未来的日期并显示错误消息(snackbar 或 toast),我所做的只是忽略所选日期。另一种解决方案也可能是使用另一个日期选择器,也许是github.com/wdullaer/MaterialDateTimePicker 在 onDateSet() 我们可以这样检查 Calendar calendar = Calendar.getInstance();日历.set(年,monthOfYear,dayOfMonth);日历 calendar1 = Calendar.getInstance(); if (calendar.getTime().after(calendar1.getTime())) Toast.makeToast(getApplicationContext,"请选择有效日期,Toast.LENGTH_LONG).show(); return; 【参考方案2】:

我正在使用它并且它工作正常

调用此函数打开日期选择器

public void openDatePicker() 
        DatePickerDialog dpd = new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
        dpd.getDatePicker().setMaxDate(System.currentTimeMillis());
        dpd.show();
    

这里是 mDateSetListener

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() 
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            date.setText(dayOfMonth + " / " + (monthOfYear + 1) + " / " + year); // Here date is a TextView to display date
            date.setVisibility(View.VISIBLE);
        
    ;

【讨论】:

【参考方案3】:

您可以使用一种方法,您可以传递用户输入的日期值并将其与当前日期进行比较,例如,如果是未来日期,您可以将使用的日期值重置为特定日期(例如当前日期)并举杯通知他。

【讨论】:

谢谢,我意识到我可以做到这一点,但我以前不必这样做(使用旧的日期选择器),我觉得很奇怪我现在必须这样做。我想知道我是否可以让日期选择器不允许选择未来的日期(如果没有,我想知道 Android 团队是否故意这样做,或者这是一个错误)【参考方案4】:

您可以通过找到正确的元素(具有“禁用”类)并将指针事件设置为无来解决您的 CSS。`

.bs-datepicker-body table td.disabled 
      pointer-events: none;

【讨论】:

问题是关于Android框架编码,而不是CSS

以上是关于在日期选择器中设置最大日期时可以选择未来日期的主要内容,如果未能解决你的问题,请参考以下文章

在引导程序日期选择器中设置思维导图

如何在物化日期选择器中设置日期

如何在 Android DatePicker 中设置最小和最大日期?

如何在日期选择器中设置日期限制

如何在日期选择器对话框中设置日期限制

在android中设置时间和日期到日期选择器和时间选择器