日期选择器 - 更改所选日期 Android
Date Picker - Change Selected Date Android
我使用了日期选择器并将最大日期应用为 2020 年 2 月 11 日,而今天的日期是 2019 年 2 月 12 日。
我在点击日期选择器顶部的 'year' 直接更改年份时遇到问题。
当日期选择器在当前日期(今天的日期: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 日。
I want to remove this selection or just make max date as selected if
year changes.
经过多次尝试和多次google搜索,终于找到了解决上述问题的方法:
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: 如果有人遇到同样的问题,将解决方案添加到我自己的问题只是一个出路。
我使用了日期选择器并将最大日期应用为 2020 年 2 月 11 日,而今天的日期是 2019 年 2 月 12 日。
我在点击日期选择器顶部的 'year' 直接更改年份时遇到问题。 当日期选择器在当前日期(今天的日期: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 日。
I want to remove this selection or just make max date as selected if year changes.
经过多次尝试和多次google搜索,终于找到了解决上述问题的方法:
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: 如果有人遇到同样的问题,将解决方案添加到我自己的问题只是一个出路。