【问题标题】:Listener when user picks a date using MaterialDateTimePicker用户使用 MaterialDateTimePicker 选择日期时的监听器
【发布时间】:2019-01-31 10:26:36
【问题描述】:

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

我使用过 dpd.setOnDateSetListener 和 public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth)。但是,它们只有在用户单击确定按钮时才会触发,并且不会在用户选择日期时立即触发。

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

在下面的屏幕截图中,您可以看到本月的所有日期都被禁用,即使选择了禁用日期,如果用户单击“确定”,它将被启用。所以我想做的是这三件事之一:

  1. 如果当前日期被禁用,则禁用“确定”按钮
  2. 或者,在打开日历后删除自动选择日期,这样用户没有选择日期意味着“确定”按钮不会获​​取任何数据。
  3. 或者,将自动选择日期设置为日历上启用的第一个日期。

我现在的问题是,如果用户点击确定,即使自动选择的日期是禁用的日期,它也会弹出显示当天的可用时间,例如星期三(从 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);

【问题讨论】:

  • 当用户点击任何日期时是否触发确定按钮?
  • 只要启用所选日期,它就可以工作,检查我编辑的问题
  • 您在项目中使用抓取或手动放置来自 lib 的代码吗?
  • 你应该自定义库,所以你想把所有的库。项目中的代码。
  • registerOnDateChangedListener有一个方法试试用这个

标签: java android calendar android-datepicker


【解决方案1】:

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

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

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

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

希望能解决您的问题。

【讨论】:

  • 感谢您的回答,关于第一部分我已经在使用这种方法 selectabledays,正如您从我上面的代码中看到的那样,但是我相信您链接的将首次启用日期设置为默认值的代码是我正在寻找的对于,但是我如何从我的动态代码中获得第一个启用日
  • 我看到您将启用的天数存储在 SelectableDays 中,如果天数在那里排序,您可以使用列表中的第一个元素来初始化您的情况下的 dpd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多