@Slaviano

Как создать календарь позволяющий выбрать несколько дат?

Здравствуйте, помогите пожалуйста, уже несколько дней пытаюсь добавить в своё приложение dialog MaterialDatePicker, по умолчанию он имеет только методы построения календаря, в котором можно выбрать либо одну дату, либо какой-либо период, но мне нужно, чтобы он имел возможность выбора нескольких дат. Например как показано на картинке 5eff29934e52f221090967.png
Может есть какой-то способ переопредения какого-либо метода который будет иметь такую возможность. Всё перерыл не могу никак найти ответ.
Мой код:
public void weekends(Long startV, Long endV) {
//создаём календарь
Calendar calendarWeekends = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendarWeekends.clear();

calendarWeekends.setTimeInMillis(startV);

//Начальный месяц для Валидатора
calendarWeekends.set(Calendar.YEAR, 2015);
calendarWeekends.set(Calendar.MONTH, 7);
long startPeriod = calendarWeekends.getTimeInMillis();

//Месяц окончания для Валидатора
calendarWeekends.set(Calendar.YEAR, 2020);
calendarWeekends.set(Calendar.MONTH, Calendar.DECEMBER);
long endPeriod = calendarWeekends.getTimeInMillis();

//устанавливаем диапазон указанных выше значений
CalendarConstraints.Builder constraintsBuilderWeekends = new CalendarConstraints.Builder();
constraintsBuilderWeekends.setStart(startPeriod);
constraintsBuilderWeekends.setEnd(endPeriod);

constraintsBuilderWeekends.setValidator(new RangeValidator(startV, endV));
constraintsBuilderWeekends.setOpenAt(startV);

MaterialDatePicker.Builder builderWeekends = MaterialDatePicker.Builder.datePicker();
builderWeekends.setCalendarConstraints(constraintsBuilderWeekends.build());
builderWeekends.setTitleText("Отметьте выходные дни");

final MaterialDatePicker materialDatePickerWeekends = builderWeekends.build();

textInputEditWeekends.setInputType(InputType.TYPE_NULL);
textInputEditWeekends.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
materialDatePickerWeekends.show(getSupportFragmentManager(), "DATE_PICKER");
}
});
textInputEditWeekends.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
materialDatePickerWeekends.show(getSupportFragmentManager(), "DATE_PICKER");
}
}
});
materialDatePickerWeekends.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() {
@Override
public void onPositiveButtonClick(Object selection) {
DateFormat dateFormat = new SimpleDateFormat("d MMMM");

textInputEditWeekends.setText("Выходные: " + dateFormat.format(selection));
textInputEditWeekends.setTextColor(Color.rgb(0, 0, 0));
}
});
}
}
class RangeValidator implements CalendarConstraints.DateValidator {

long minDate, maxDate;

RangeValidator(long minDate, long maxDate) {
this.minDate = minDate;
this.maxDate = maxDate;
}

RangeValidator(Parcel parcel) {
minDate = parcel.readLong();
maxDate = parcel.readLong();
}

@Override
public boolean isValid(long date) {
return !(minDate > date || maxDate < date);
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(minDate);
dest.writeLong(maxDate);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

@Override
public RangeValidator createFromParcel(Parcel parcel) {
return new RangeValidator(parcel);
}

@Override
public RangeValidator[] newArray(int size) {
return new RangeValidator[size];
}
};
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ну в общем я посмотрел, там есть такой скрытый метод
MaterialDatePicker.Builder::customDatePicker().
Думаю, если туда дать правильную реализацию DateSelector'a, то всё заработает. Сделать такую реализацию тривиально.
С доступом к методу могут быть проблемы, он помечен как недоступный юзеру. Можно рефлексией его достать и дёрнуть, в принципе это в данном случае нестрашно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы