Я новичок в андроиде. Теперь я хочу установить диапазон календаря всего на один месяц с сегодняшнего дня. Я пробовал это решение, но я до сих пор не понимаю, как сделать его динамичным. И я использую средство выбора даты материала. Вот мой код:
private static Calendar getClearedUTC() {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.clear();
return calendar;
}
private void initSetting() {
today = MaterialDatePicker.todayInUtcMilliseconds();
Calendar calendar = getClearedUTC();
calendar.roll(Calendar.MONTH, -1);
monthBefore = calendar.getTimeInMillis();
todayPair = new Pair<>(today, today);
mothBeforePair = new Pair<>(monthBefore, monthBefore);
}
void onGroupClick(){
initSetting();
MaterialDatePicker.Builder<Pair<Long, Long>> builder = MaterialDatePicker.Builder.dateRangePicker();
builder.setTitleText("Pilih tanggal");
builder.setSelection(todayPair);
// builder.setCalendarConstraints(limitRange().build());
CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(today);
final MaterialDatePicker materialDatePicker = builder.build();
dateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
materialDatePicker.show(getSupportFragmentManager(), "DATE_PICKER");
}
});
materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() {
@Override
public void onPositiveButtonClick(Object selection) {
dateTV.setText(materialDatePicker.getHeaderText());
}
});
}
Кто-нибудь может мне помочь?
@Zain извините за поздний ответ, я хочу, чтобы это было 1 месяц назад сегодня
Получите сегодня с: Calendar.getInstance()
Добавьте один месяц с помощью: maxDate.add(Calendar.DAY_OF_MONTH, 30)
Вычтите один месяц из: maxDate.add(Calendar.DAY_OF_MONTH, -30)
private void enableOneMonthSinceToday() {
MaterialDatePicker.Builder<Long> builderRange = MaterialDatePicker.Builder.datePicker();
builderRange.setCalendarConstraints(oneMonthBeforeTodayConstraints().build());
MaterialDatePicker<Long> pickerRange = builderRange.build();
pickerRange.show(getSupportFragmentManager(), pickerRange.toString());
}
private CalendarConstraints.Builder oneMonthBeforeTodayConstraints() {
CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();
Calendar maxDate = Calendar.getInstance();
Calendar minDate = Calendar.getInstance();
minDate.add(Calendar.DAY_OF_MONTH, -30); // subtracting 30 days
constraintsBuilderRange.setStart(minDate.getTimeInMillis());
constraintsBuilderRange.setEnd(maxDate.getTimeInMillis() );
constraintsBuilderRange.setValidator(new RangeValidator(minDate.getTimeInMillis(), maxDate.getTimeInMillis()));
return constraintsBuilderRange;
}
И подтвердите диапазон с минимальными и максимальными значениями с помощью RangeValidator
static class RangeValidator implements CalendarConstraints.DateValidator {
long minDate, maxDate;
RangeValidator(long minDate, long maxDate) {
this.minDate = minDate;
this.maxDate = maxDate;
}
RangeValidator(Parcel parcel) {
}
@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) {
}
public static final Parcelable.Creator<RangeValidator> CREATOR = new Parcelable.Creator<RangeValidator>() {
@Override
public RangeValidator createFromParcel(Parcel parcel) {
return new RangeValidator(parcel);
}
@Override
public RangeValidator[] newArray(int size) {
return new RangeValidator[size];
}
};
}
Использование:
enableOneMonthSinceToday();
Эй, я получаю ошибку в OneMonthValidator()
, не могли бы вы сказать мне, откуда она?
@mochim Я изменил его на месяц назад .. пожалуйста, проверьте его сейчас, это было для тестирования, и я забыл его удалить ..
Вы хотите это 1 месяц назад или вперед сегодня?