用户使用 MaterialDateTimePicker 选择日期时的监听器
Listener when user picks a date using MaterialDateTimePicker
我目前正在使用 MaterialDateTimePicker 库来选择日期,
我正在尝试收听用户从日历中 select 天打开另一个列表的时间取决于用户 selected.
的日期
我用过dpd.setOnDateSetListener
和publicvoidonDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth)
。但是,只有当用户单击“确定”按钮时,它们才会被触发,而当用户 selects 日期时不会立即触发。
有没有办法知道用户 select 的约会时间?
在下面的屏幕截图中,您可以看到本月的所有日期都被禁用,即使禁用的日期已 selected,如果用户单击“确定”,它将被启用。所以我想做的是这三件事之一:
- 如果禁用当天,则禁用确定按钮
- 或者,在打开日历后删除自动 select 日期,这样用户就没有日期 selected 意味着“确定”按钮不会获得任何数据。
- 或者,将自动 select 日设置为日历上启用的第一天。
我现在的问题是,如果用户点击确定,即使自动 selected 日是禁用日,它也会弹出显示前议员星期三当天的可用时间(从 10 到15)
我当前设置启用天数和禁用天数的代码:
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);
有一个变通方法,它有一个由库 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
);
希望能解决您的问题。
我目前正在使用 MaterialDateTimePicker 库来选择日期, 我正在尝试收听用户从日历中 select 天打开另一个列表的时间取决于用户 selected.
的日期我用过dpd.setOnDateSetListener
和publicvoidonDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth)
。但是,只有当用户单击“确定”按钮时,它们才会被触发,而当用户 selects 日期时不会立即触发。
有没有办法知道用户 select 的约会时间?
在下面的屏幕截图中,您可以看到本月的所有日期都被禁用,即使禁用的日期已 selected,如果用户单击“确定”,它将被启用。所以我想做的是这三件事之一:
- 如果禁用当天,则禁用确定按钮
- 或者,在打开日历后删除自动 select 日期,这样用户就没有日期 selected 意味着“确定”按钮不会获得任何数据。
- 或者,将自动 select 日设置为日历上启用的第一天。
我现在的问题是,如果用户点击确定,即使自动 selected 日是禁用日,它也会弹出显示前议员星期三当天的可用时间(从 10 到15)
我当前设置启用天数和禁用天数的代码:
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);
有一个变通方法,它有一个由库 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
);
希望能解决您的问题。