我用于活动的日期选择器在KitKat上崩溃了,但适用于所有其他较新的操作系统。这是我在旧设备上得到的例外:
java.lang.IllegalArgumentException: fromDate: 周一 Apr 10 07:59:25 EDT 2017 年不早于日期:2017 年 4 月 10 日星期一 07:59:25 EDT
代码块堆栈跟踪指向:
private void showDatePicker(){
DatePickerDialog datePickerDialog = new DatePickerDialog(
getActivity(), this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
//this is where the crash happens
datePickerDialog.getDatePicker().setMinDate(new Date().getTime());
datePickerDialog.show();
}
如果有关该问题的信息足够,请告诉我。有什么解决方法吗?
我应用延迟解决了这个问题:
private void showDatePicker(){
DatePickerDialog datePickerDialog = new DatePickerDialog(
getActivity(), this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
//this is where the crash happens
datePickerDialog.getDatePicker().setMinDate(new Date().getTime() - 10000);
datePickerDialog.show();
}
要解决此问题,请在 DatePickerDialog 实例化之前为 minDate 创建一个时间戳:
private void showDatePicker(){
long now = System.currentTimeMillis();
DatePickerDialog datePickerDialog = new DatePickerDialog(
getActivity(), this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
datePickerDialog.getDatePicker().setMinDate(now);
datePickerDialog.show();
}
此崩溃是由于 API21 之前的日历视图和 API21 之前的 calendarViewMode == MODE_HOLO
中的错误而发生的。
尽管setMinDate
包含带有注释突出显示的更正:
public void setMinDate(long minDate) {
...
mMinDate.setTimeInMillis(minDate);
// make sure the current date is not earlier than
// the new min date since the latter is used for
// calculating the indices in the adapter thus
// avoiding out of bounds error
Calendar date = mAdapter.mSelectedDate;
if (date.before(mMinDate)) {
mAdapter.setSelectedDay(mMinDate);
}
// reinitialize the adapter since its range depends on min date
mAdapter.init();
签入setSelectedDay
仅比较mMinDate
和mSelectedDate
的日期准确性:
public void setSelectedDay(Calendar selectedDay) {
if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDate.get(Calendar.DAY_OF_YEAR)
&& selectedDay.get(Calendar.YEAR) == mSelectedDate.get(Calendar.YEAR)) {
return;
}
mSelectedDate
和mMinDate
是同一天的积分,因此mSelectedDate
将保持不变(即处于错误的状态mSelectedDate < mMinDate
(。
然后控制流将运行到 mAdapter.init
,然后进入getWeeksSinceMinDate
。在此函数中,将以毫秒级精度执行mMinDate
和mSelectedDate
的比较:
private int getWeeksSinceMinDate(Calendar date) {
if (date.before(mMinDate)) {
throw new IllegalArgumentException("fromDate: " + mMinDate.getTime()
+ " does not precede toDate: " + date.getTime());
}
而且由于mSelectedDate
在mMinDate
崩溃发生之前的几毫秒内初始化
在较新的实现中,此代码已重写,因此 API21+ 缺少此问题。