即使在将 setMaxDate()
应用于日期选择器之后,我仍然能够在 lollipop 5.0.1 上选择禁用的日期。该代码适用于除 lollipop 5.0.1 以外的所有其他版本的 android。
在通过设置 setMaxDate()
限制日期后,任何用户都不能选择禁用的日期。如何以编程方式为 DatePicker
实现此目的?
我试过下面的代码:-
datePickerDialog = new DatePickerDialog(myContext, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
}
}, mYear, mMonth, mDay);
datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
datePickerDialog.setCanceledOnTouchOutside(true);
datePickerDialog.setCancelable(true);
datePickerDialog.show();
我也尝试了以下解决方案,但这些似乎不起作用:-
datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
和
Calendar maxCal = Calendar.getInstance();
datePickerDialog.getDatePicker().setMaxDate(maxCal.getTimeInMillis());
和
Date maxDate = new Date();
datePickerDialog.getDatePicker().setMaxDate(maxDate.getTime());
请向 setMaxDate()
提供适用于 lollipop 的解决方案。
或者,如果您有任何其他答案,请尝试包括官方报价和资源或链接(如 android 开发者网站),如果您知道并提供简短的详细信息。提前致谢。
最佳答案
正如评论中已经指出的那样,这个有问题的日历没有真正完美的解决方案(在 Android 5.0 上你可以选择一个无效的日期,在一些三星设备上出现了一个奇怪的行为:按下后退按钮实际上是在选择一个日期和其他人我真的不记得了)。但是,当您可以通过检查其有效性并在失败时显示 Toast
来选择无效日期时,我解决了这个问题。这不会阻止用户实际选择无效日期,而是强制用户选择有效日期以继续使用该应用。
DatePickerDialog dialog = new DatePickerDialog(getActivity(), mOnDateSetListener, year, month, day) {
private boolean allowClose = false;
@Override
public void onBackPressed() {
allowClose = true;
super.onBackPressed();
}
@Override
public void onClick(DialogInterface dialog, int which) {
allowClose = true;
if (which == DialogInterface.BUTTON_POSITIVE && !validate()) {
allowClose = false;
Toast.makeText(getContext(), R.string.invalid_date, Toast.LENGTH_SHORT).show();
}
if (allowClose) {
super.onClick(dialog, which);
}
}
@Override
public void dismiss() {
if (allowClose) {
super.dismiss();
}
}
};
通过使用它,您可以确保如果用户选择了一个无效日期,您将给他一个正确的警告消息并在您按下 Ok
按钮时阻止日历关闭。应该创建 validate
函数来满足您的需求,但我认为我所拥有的就可以了:
private boolean validate() {
if (this.getDialog() instanceof DatePickerDialog) {
DatePicker datePicker = ((DatePickerDialog) this.getDialog()).getDatePicker();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, datePicker.getYear());
calendar.set(Calendar.MONTH, datePicker.getMonth());
calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
boolean valid = false;
Calendar minCalendar = Calendar.getInstance();
minCalendar.setTimeInMillis(datePicker.getMinDate());
Calendar maxCalendar = Calendar.getInstance();
maxCalendar.setTimeInMillis(datePicker.getMaxDate());
if (DateUtils.in(calendar.getTime(), minCalendar.getTime(), maxCalendar.getTime())) {
valid = true;
}
return valid;
}
return false;
}
最后,我不保证这是最好的解决方案,但我已经使用过它并且没有收到用户的任何投诉。
关于java - setMaxDate() 在 Lollipop 5.0.1 android 上无法完美运行,需要适当的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43908314/