用户使用MaterialDateTimePicker选择日期时的侦听器

时间:2019-01-31 10:26:37

标签: java android calendar android-datepicker

我目前正在使用MaterialDateTimePicker库进行日期选择, 并且我正在尝试收听用户何时从日历中选择要打开另一个列表的日期取决于用户选择的日期。

我使用了dpd.setOnDateSetListener和公共无效onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth)。但是,只有当用户单击“确定”按钮时,两者才会被触发,而当用户选择日期时,不会立即触发。

有没有办法知道用户何时选择日期?

在下面的屏幕快照中,即使选择了禁用日期,您也可以看到该月的所有日期都被禁用,并且如果用户单击“确定”,则将被启用。所以我想做的是那三件事之一:

  1. 如果当前日期已禁用,则禁用“确定”按钮
  2. 或者,一旦打开日历,则删除自动选择的日期,以便用户没有选择日期,这意味着“确定”按钮将无法获取任何数据。
  3. 或者,将自动选择日期设置为日历中的第一个启用日期。

我现在的问题是,即使用户将“自动选择的日期”设置为“禁用”,如果用户单击“确定”,它将弹出以显示该日期的可用时间(例如,星期三前10点到15点)

Screenshot

我的当前代码以设置启用日期和禁用日期:

Calendar day;
List<Calendar> weekends = new ArrayList<>();
int weeks = 5;

for (int i = 0; i < (weeks * 7); i = i + 7) {

    for (int d = 0; d < slots.getResponse().getDays().size(); d++) {

        day = Calendar.getInstance();
        switch (slots.getResponse().getDays().get(d).getDay()) {
            case "Sunday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.SUNDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Monday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.MONDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Tuesday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.TUESDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Wednesday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.WEDNESDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Thursday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.THURSDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Friday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.FRIDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
            case "Saturday":
                day.add(Calendar.DAY_OF_YEAR, (Calendar.SATURDAY - day.get(Calendar.DAY_OF_WEEK) + i));
                weekends.add(day);
                break;
        }
    }
}

Calendar[] SelectableDays = weekends.toArray(new Calendar[weekends.size()]);
dpd.setSelectableDays(SelectableDays);

Calendar minday = Calendar.getInstance();
minday.add(Calendar.DAY_OF_YEAR, minday.get(Calendar.DAY_OF_MONTH) + 1);
dpd.setMinDate(minday);

/*
Disable Upcoming Daysa
 */

Calendar UpcomingDay;
boolean FirstLoop = true;
List<Calendar> nextDaysList = new ArrayList<>();
for (int i = 0; i < slots.getResponse().getExecTime() - 1; i++) {
    UpcomingDay = Calendar.getInstance();
    if (FirstLoop) {
        UpcomingDay.add(Calendar.DAY_OF_MONTH, i);
        i--;
        FirstLoop = false;
    } else {
        UpcomingDay.add(Calendar.DAY_OF_MONTH, i + 1);
    }
    nextDaysList.add(UpcomingDay);
}

Calendar[] DisabledDays = nextDaysList.toArray(new Calendar[nextDaysList.size()]);
dpd.setDisabledDays(DisabledDays);

1 个答案:

答案 0 :(得分:1)

有一种解决方法,该方法具有setSelectableDays(Calendar[] days)库提供的直接API。这需要一个天数组作为参数,并使您能够仅启用要启用的天。

因此,您可以考虑启用它,而不是禁用日期。

设置DatePickerDialog时,您可以考虑将第一个启用日期也设为默认日期,这也可能会解决您的问题。初始化为您的第一个启用日期的值。

DatePickerDialog dpd = DatePickerDialog.newInstance(
  MainActivity.this,
  enabledYear, // Initial enabled year selection
  enabledMonth, // Initial enabled month selection
  enabledDayOfMonth // Inital enabled day selection
);

希望能解决您的问题。