• 13
name

A PHP Error was encountered

Severity: Notice

Message: Undefined index: userid

Filename: views/question.php

Line Number: 191

Backtrace:

File: /home/prodcxja/public_html/questions/application/views/question.php
Line: 191
Function: _error_handler

File: /home/prodcxja/public_html/questions/application/controllers/Questions.php
Line: 433
Function: view

File: /home/prodcxja/public_html/questions/index.php
Line: 315
Function: require_once

I'm currently using MaterialDateTimePicker library for date picking, and I'm trying to listen when the user select day from the calendar to open another list depends on the day the user selected.

I have used dpd.setOnDateSetListener and public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth). However, both of them are getting triggered only when the user clicks on the OK button and it doesn't trigger right away when the user selects the date.

Is there a way to be able to know when the user selects date?

In the screenshot below, you can see all days in this month are disabled even though the disabled day is selected and if the user clicks OK, it will be enabled. So what I'm trying to do is one of those 3 things:

  1. Disable the OK button if the current day is disabled
  2. Or, remove the auto select day once the calendar is opened so the user has no date selected means OK button won't get any data.
  3. Or, set the auto select day to be the first enabled day on the calendar.

My problem right now that if the user hit ok even the auto selected day is a disabled day it will pop up to display the available times in that day for ex-mp Wednesday (from 10 to 15)

Screenshot

My Current code to set enabled days and disabled days :

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);

There is a workaround that has a direct API provided by the library which is setSelectableDays(Calendar[] days). This takes an array of days as the parameter and enables you to enable the days only which you want to have enabled.

Hence, instead of disabling the dates, you may consider enabling it.

While setting up your DatePickerDialog, you may consider having the first enabled date as default as well, which might solve your problem as well. Initialize with the value that is your first enabled day.

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

Hope that solves your problem.

  • 1
Reply Report
    • Thanks for your answer, about first part im already using this method selectabledays as you can see from my code above, however i believe the code the you linked that set first enabled date as default is what im looking for, but how do i get the first enabled day from my dynamic code
      • 2
    • I see you are storing the enabled days in SelectableDays, and if the days are sorted there, you can just use the first element from the list to initialize the dpd in your case.