Слушатель, когда пользователь выбирает дату, используя MaterialDateTimePicker - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я использую библиотеку MaterialDateTimePicker для выбора даты, и я пытаюсь прослушать, когда пользователь выбирает день в календаре, чтобы открыть другой список, зависит от дня, который выбрал пользователь.

Я использовал dpd.setOnDateSetListener и public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth).Тем не менее, оба они запускаются только тогда, когда пользователь нажимает кнопку ОК, и он не срабатывает сразу, когда пользователь выбирает дату.

Есть ли способ узнать, когда пользовательвыбирает дату?

На приведенном ниже снимке экрана видно, что все дни в этом месяце отключены, даже если выбран отключенный день, и если пользователь нажимает кнопку ОК, он будет включен.Так что я пытаюсь сделать одну из этих трех вещей:

  1. Отключить кнопку ОК, если текущий день отключен
  2. Или удалить день автоматического выбора дня в календареоткрывается, поэтому у пользователя не выбрана дата, значит кнопка ОК не получит никаких данных.
  3. Или установите день автоматического выбора на первый включенный день в календаре.

Моя проблема сейчас в том, что если пользователь нажал кнопку «ОК», даже если выбранный автоматически день является отключенным днем, то появится всплывающее окно с отображением доступного времени в этот день для ex-mp среды (с 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 голосов
/ 27 февраля 2019

Существует обходной путь, который имеет прямой 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
);

Надеюсь, что решит вашу проблему.

...