Отключить даты в средстве выбора даты материала в студии Android

Мне бы хотелось иметь вариант, в котором я бы выбрал maxDate и minDate, используя ограничения календаря. Точно так же, как обычный DatePicker имеет методы DatePicker.setMaxDate() и DatePicker.setMinDate(), мне бы хотелось, чтобы те же методы использовались для materialDatePicker.

Я использую materialDatePicker при разработке своего приложения, и мне трудно установить свойства minDate и maxDate для открытого datePicker. Я открываю средство выбора даты, чтобы выбрать дату начала и дату окончания в двух разных текстовых полях для добавления определенного периода. Нет, я не хочу выбирать дату в диапазоне. Я изучил это, и это не соответствует моим требованиям. Я могу установить maxDate, используя

calendarConstraints.setValidator(DateValidatorPointForward.from(startDate)) 

но я не могу выбрать minDate с помощью materialDatePicker.

код:

     CalendarConstraints.Builder ccb=new CalendarConstraints.Builder();
//        ccb.setEnd(calendar.getTimeInMillis());

//        ccb.setEnd(today);

        MaterialDatePicker.Builder<Pair<Long,Long>> builder = MaterialDatePicker.Builder.dateRangePicker();
        builder.setTitleText("Select Date Range");
        builder.setCalendarConstraints(ccb.build());

person Omkar Ghurye    schedule 25.03.2020    source источник
comment
Поделитесь своим кодом   -  person Muhammad Qasim    schedule 25.03.2020
comment
я добавил код в сообщение   -  person Omkar Ghurye    schedule 26.03.2020
comment
Можете ли вы объяснить, как изменить текст кнопки сохранения?   -  person Omkar Ghurye    schedule 25.04.2020


Ответы (2)


Вы можете создать собственный класс CalendarConstraints.DateValidator, который принимает минимальные и максимальные даты и проверяет их, переопределяя метод isValid(), который возвращает логическое значение, указывающее, является ли определенная дата, которая будет отображаться на экране, действительной или нет.

Вот полный пример, в котором выбираются даты с 15 февраля 2020 года по 20 марта 2020 года.

введите описание изображения здесь

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MaterialDatePicker.Builder<Pair<Long, Long>> builderRange = MaterialDatePicker.Builder.dateRangePicker();
        builderRange.setCalendarConstraints(limitRange().build());
        builderRange.setTitleText("Select Date Range");
        MaterialDatePicker<Pair<Long, Long>> pickerRange = builderRange.build();
        pickerRange.show(getSupportFragmentManager(), pickerRange.toString());

    }



    /*
       Limit selectable Date range
     */
    private CalendarConstraints.Builder limitRange() {

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

        Calendar calendarStart = Calendar.getInstance();
        Calendar calendarEnd = Calendar.getInstance();

        int year = 2020;
        int startMonth = 2;
        int startDate = 15;

        int endMonth = 3;
        int endDate = 20;
        calendarStart.set(year, startMonth - 1, startDate - 1);
        calendarEnd.set(year, endMonth - 1, endDate);

        long minDate = calendarStart.getTimeInMillis();
        long maxDate = calendarEnd.getTimeInMillis();


        constraintsBuilderRange.setStart(minDate);
        constraintsBuilderRange.setEnd(maxDate);
        constraintsBuilderRange.setValidator(new RangeValidator(minDate, maxDate));

        return constraintsBuilderRange;
    }




    static 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<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];
            }
        };


    }

}
person Zain    schedule 10.04.2020
comment
Можете ли вы объяснить, как изменить текст кнопки сохранения? - person Omkar Ghurye; 25.04.2020
comment
@OmkarGhurye Я этого раньше не делал. Пожалуйста, проверьте это поможет - person Zain; 25.04.2020
comment
нет, сэр, это не работает, пожалуйста, помогите - person Omkar Ghurye; 25.04.2020
comment
@OmkarGhurye Я понятия не имею .. пожалуйста, откройте новый вопрос, чтобы кто-нибудь мог вам помочь - person Zain; 25.04.2020

Вы должны использовать функцию DateValidatorPointBackward для установки maxDate. Что-то вроде этого:

val constraintsBuilder = CalendarConstraints.Builder()
val validators: ArrayList<CalendarConstraints.DateValidator> = ArrayList()
validators.add(DateValidatorPointForward.from(minDate))
validators.add(DateValidatorPointBackward.before(maxDate))
constraintsBuilder.setValidator(CompositeDateValidator.allOf(validators))
person tamnd    schedule 10.04.2020
comment
Можете ли вы объяснить, как изменить текст кнопки сохранения? - person Omkar Ghurye; 25.04.2020
comment
Отлично, это избавляет меня от создания собственного валидатора даты :) - person Rvb84; 10.05.2020
comment
@tamnd, как мы можем сделать это в Java? - person Rooh Al-mahaba; 16.06.2020