DateRangePicker установил ограничение за месяц до сегодняшнего дня

Я новичок в андроиде. Теперь я хочу установить диапазон календаря всего на один месяц с сегодняшнего дня. Я пробовал это решение, но я до сих пор не понимаю, как сделать его динамичным. И я использую средство выбора даты материала. Вот мой код:

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

Кто-нибудь может мне помочь?

Вы хотите это 1 месяц назад или вперед сегодня?

Zain 15.12.2020 08:29

@Zain извините за поздний ответ, я хочу, чтобы это было 1 месяц назад сегодня

mochim 15.12.2020 10:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 15.12.2020 12:26

@mochim Я изменил его на месяц назад .. пожалуйста, проверьте его сейчас, это было для тестирования, и я забыл его удалить ..

Zain 15.12.2020 12:29

Другие вопросы по теме