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

Able to choose future date when setting max date in datepicker

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

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

设置 max date 时选择未来的日期
datePicker.setMaxDate(Calendar.getInstance().getTimeInMillis())

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

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

更新:

虽然它在我的 Nexus 4 运行 stock 5.0 上无法正常工作,但它在我的 Nexus 6 运行 stock Android 5.1.1 上可以正常工作。也许这是 Android 5.0 中的错误,并在 5.1 中修复了?谁能确认一下?

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

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

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

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);
        }
    };

所以回答我自己的问题:

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

setMaxDate() 5.1 的新功能是

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

已更改为:

mDayPickerView.setMaxDate(maxDate);

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

所以我们似乎一直在处理它在 Android 5.0 中不能正常工作的事实(最大日期后的天数变灰但仍然可以选择)。

您可以通过找到正确的元素(使用 "disabled" class)并将指针事件设置为 none 来解决 CSS 上的问题。`

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