Select Maximum 30 days in MaterialDatePicker Calender

54 Views Asked by At

I am using Material Date Picker for start date and end date. Now I want to restrict the user not to select more than 30 days. I have also used RangeDateValidator but it's giving error on getSelection. Below is the error with code:

Error : Attempt to invoke virtual method 'java.lang.Object com.google.android.material.datepicker.MaterialDatePicker.getSelection()' on a null object reference

MainActivity:

        MaterialDatePicker.Builder<Pair<Long, Long>> builder1 = 
        MaterialDatePicker.Builder.dateRangePicker();
        builder1.setTitleText("Select Date");

        Calendar minDate = Calendar.getInstance();
        minDate.add(Calendar.DAY_OF_MONTH, -60);


        RangeDateValidator dateValidator = new RangeDateValidator(30);

        CalendarConstraints.Builder calendarConstraintBuilder = new 
        CalendarConstraints.Builder();

        calendarConstraintBuilder.setValidator(DateValidatorPointBackward.now());
        calendarConstraintBuilder.setValidator(dateValidator);
        calendarConstraintBuilder.setStart(minDate.getTimeInMillis());

        builder1.setCalendarConstraints(calendarConstraintBuilder.build());


        // Building the date picker dialog
        MaterialDatePicker<Pair<Long, Long>> datePicker = builder1.build();
        datePicker.addOnPositiveButtonClickListener(selection -> {

            dateValidator.setDatePicker(datePicker);
            datePicker.show(getSupportFragmentManager(),datePicker.getTag());

            // Retrieving the selected start and end dates
            Long sDate = selection.first;
            Long eDate = selection.second;

            // Formating the selected dates as strings
            SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy", 
            Locale.getDefault());
            String startDateString = sdf.format(new Date(sDate));
            String endDateString = sdf.format(new Date(eDate));

            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd", 
            Locale.getDefault());

            // Creating the date range string
            String selectedDateRange = startDateString + " - " + endDateString;

            // Displaying the selected date range in the TextView
            edit_date.setText(selectedDateRange);
            startDate = sdf1.format(new Date(sDate));
            endDate = sdf1.format(new Date(eDate));
        });

        // Showing the date picker dialog
        datePicker.show(getSupportFragmentManager(), "DATE_PICKER");
        });

RangeDateValidator Class

    public class RangeDateValidator implements CalendarConstraints.DateValidator {

    private MaterialDatePicker rangePicker;
    private final int numberOfDays;

    public RangeDateValidator(int numberOfDays){
        this.numberOfDays = numberOfDays;
    }

    public void setDatePicker(MaterialDatePicker rangePicker) {
        this.rangePicker = rangePicker;
    }

    @Override
    public boolean isValid(long date) {
        Pair<Long,Long> selection = (Pair<Long, Long>) rangePicker.getSelection();
        if (selection != null) {
            Long startDate = selection.first;
            if (startDate != null) {
                long days = (numberOfDays-1) * TimeUnit.DAYS.toMillis(1);;
                if (date > startDate + days)
                    return false;
                if (date < startDate)
                    return false;
            }
        }
        return true;
    }

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {

}
0

There are 0 best solutions below