Java 日期选择器的Android IllegalArgumentException

Java 日期选择器的Android IllegalArgumentException,java,android,datepicker,Java,Android,Datepicker,我用于活动的日期选择器在KitKat上崩溃,但在其他所有更新的操作系统上都能工作。这是我在旧设备上遇到的例外情况: java.lang.IllegalArgumentException:fromDate:Mon Apr 10 07:59:25美国东部时间 2017年不早于2017年4月10日星期一07:59:25美国东部时间 代码块堆栈跟踪指向: private void showDatePicker(){ DatePickerDialog datePickerDialog = new D

我用于活动的日期选择器在KitKat上崩溃,但在其他所有更新的操作系统上都能工作。这是我在旧设备上遇到的例外情况:

java.lang.IllegalArgumentException:fromDate:Mon Apr 10 07:59:25美国东部时间 2017年不早于2017年4月10日星期一07:59:25美国东部时间

代码块堆栈跟踪指向:

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=新建DatePickerDialog(
getActivity(),this,calendar.get(calendar.YEAR),calendar.get(calendar.MONTH),calendar.get(calendar.DAY/OF/u MONTH));
datePickerDialog.getDatePicker().setMinDate(现在);
datePickerDialog.show();
}

此崩溃是由于API21之前版本的CalendarView和API21的
calendarViewMode==MODE_HOLO
中的错误造成的

尽管
setMinDate
包含一个用注释突出显示的更正:

public void setMinDate(long minDate){
...
mMinDate.setTimeInMillis(minDate);
//确保当前日期不早于
//新的最小日期,因为后者用于
//计算适配器中的索引
//避免越界错误
日历日期=mAdapter.mSelectedDate;
如果(日期之前(日期)){
设定选定日期(mm日期);
}
//重新初始化适配器,因为其范围取决于最小日期
mAdapter.init();
签入
setSelectedDay
仅比较
mMinDate
mSelectedDate
的日期准确性:

public void setSelectedDay(日历selectedDay){
if(selectedDay.get(日历年的日历日)=mSelectedDate.get(日历年的日历日)
&&selectedDay.get(Calendar.YEAR)=mSelectedDate.get(Calendar.YEAR)){
返回;
}
mSelectedDate
mMinDate
是指向同一天的点,因此
mSelectedDate
将保持不变(即处于错误状态
mSelectedDate

然后,控制流将运行到
mAdapter.init
,然后进入
getWeeksSinceMinDate
。在此函数中,将以毫秒精度对
mMinDate
mSelectedDate
进行比较:

private int getWeeksSinceMinDate(日历日期){
如果(日期之前(日期)){
抛出新的IllegalArgumentException(“fromDate:+mMinDate.getTime())
+不在toDate之前:“+date.getTime());
}
由于
mselectedate
是在
mMinDate
之前几毫秒内初始化的,因此会发生崩溃


在较新的实现中,此代码被重写,因此API21+缺少此问题。

发生此问题的原因是什么?这也会影响较新设备/操作系统上的行为吗?在我的应用程序中,此修复不会影响新设备/操作系统。我想这是因为Android无法设置与当前日期相同的最小日期。@Dinuka这是由于API21之前版本的CalendarView和API21版本的calendarViewMode==MODE_HOLO中的错误造成的。对于SDK的较新版本,CalendarView的代码不同,并且不包含可能出现的