android - 日期选择器 - 更改所选日期 Android
问题描述
我使用了日期选择器并将最大日期应用为 2020 年 2 月 11 日,而今天的日期是 2019 年 2 月 12 日。
我在直接单击日期选择器顶部的“年份”时更改年份时遇到问题。当日期选择器在当前日期(今天的日期:2019 年 2 月 12 日)初始化时,如果我将年份更改为 2020 年 2 月,日期选择器将 2020 年 2 月 12 日显示为标题,但日历视图上的选定日期为 2 月 11 日。
见下图::
img 1 : 在日期选择器上初始化为今天的日期
img 2 : 不换日,换年
img 3:标题为 2020 年 2 月 12 日。但由于最大日期是 2020 年 2 月 11 日。在日历上选择了 11 日。此外,单击“确定”后,将获得 2020 年 2 月 12 日。
如果年份发生变化,我想删除此选择或仅选择最大日期。
解决方案
经过多次尝试和谷歌搜索,终于找到了上面的解决方案:
datePicker.init(currentCalendar.get(Calendar.YEAR),
currentCalendar.get(Calendar.MONTH),
currentCalendar.get(Calendar.DAY_OF_MONTH),
new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int selYear, int selMonth,
int selDay) {
String dateSelectionType =
getDateSelectionType(minDate.getTimeInMillis(),
maxDate.getTimeInMillis(), selYear, selMonth, selDay);
if (dateSelectionType.equals("IS_BETWEEN_RANGE")) {
return;
}
if (dateSelectionType.equals("IS_LESS_THAN_MIN")) {
datePicker.updateDate(minDate.get(Calendar.YEAR), minDate.get(Calendar.MONTH),
minDate.get(Calendar.DAY_OF_MONTH));
return;
}
if (dateSelectionType.equals("IS_MORE_THAN_MAX")) {
datePicker.updateDate(maxDate.get(Calendar.YEAR),
maxDate.get(Calendar.MONTH), maxDate.get(Calendar.DAY_OF_MONTH));
return;
}
}
});
添加另一种方法来了解所选日期是在最大日期之后还是在最小日期之前::
public static String getDateSelectionType(long minDate, long maxDate,
int selectedYear, int selectedMonth, int selectedDayOfMonth) {
Calendar minDateCalendar = Calendar.getInstance();
minDateCalendar.setTimeInMillis(minDate);
minDateCalendar.set(Calendar.HOUR_OF_DAY, 0);
minDateCalendar.set(Calendar.MINUTE, 0);
minDateCalendar.set(Calendar.SECOND, 0);
minDateCalendar.set(Calendar.MILLISECOND, 0);
Calendar maxDateCalendar = Calendar.getInstance();
maxDateCalendar.setTimeInMillis(maxDate);
maxDateCalendar.set(Calendar.HOUR_OF_DAY, 0);
maxDateCalendar.set(Calendar.MINUTE, 0);
maxDateCalendar.set(Calendar.SECOND, 0);
maxDateCalendar.set(Calendar.MILLISECOND, 0);
Calendar selectedDateCalendar = Calendar.getInstance();
selectedDateCalendar.set(Calendar.YEAR, selectedYear);
selectedDateCalendar.set(Calendar.MONTH, selectedMonth);
selectedDateCalendar.set(Calendar.DAY_OF_MONTH, selectedDayOfMonth);
selectedDateCalendar.set(Calendar.HOUR_OF_DAY, 0);
selectedDateCalendar.set(Calendar.MINUTE, 0);
selectedDateCalendar.set(Calendar.SECOND, 0);
selectedDateCalendar.set(Calendar.MILLISECOND, 0);
if (selectedDateCalendar.getTime().before(minDateCalendar.getTime()))
return "IS_LESS_THAN_MIN";
if (selectedDateCalendar.getTime().after(maxDateCalendar.getTime()))
return "IS_MORE_THAN_MAX";
return "IS_BETWEEN_RANGE";
}
PS:如果有人面临同样的问题,将解决方案添加到我自己的问题中只是一种出路。
推荐阅读
- linq - 将 Linq 列与最小值列连接
- python - 在另一个方法中创建方法
- python - 无法在 Python 中捕获 ValueError
- c++ - 发送和十六进制消息时套接字代码 C++ 的问题
- react-native - React Navigation 抽屉不显示当前页面的标题
- python - 如何旋转 QImage
- portable-executable - 可移植可执行 (PE) 文件中 .crt 部分的格式?
- python - 运行python程序时出现错误550
- odata - CRM 365 虚拟实体上的错误映射选项集
- python - 使用公共日期参数从两个不同的数据框创建新的 Pandas 数据框