首页 > 解决方案 > 日期选择器 - 更改所选日期 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 日。

在此处输入图像描述

如果年份发生变化,我想删除此选择或仅选择最大日期。

标签: androidandroid-studiodatepickerandroid-datepickerdatepickerdialog

解决方案


经过多次尝试和谷歌搜索,终于找到了上面的解决方案:

        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:如果有人面临同样的问题,将解决方案添加到我自己的问题中只是一种出路。


推荐阅读