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) {
}