在android studio中的Material Date Picker中禁用日期 [英] Disable dates in Material date picker in android studio

查看:352
本文介绍了在android studio中的Material Date Picker中禁用日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望有一个选择,可以使用calendarConstraints选择maxDate和minDate.就像普通的DatePicker具有 DatePicker.setMaxDate() DatePicker.setMinDate()方法一样,我也希望对materialDatePicker使用相同的方法.

I would love to have am an option where I would select a maxDate and a minDate using calendarConstraints. Just like the normal DatePicker has DatePicker.setMaxDate() and DatePicker.setMinDate() methods, I would love the same methods for materialDatePicker.

我在开发应用程序时正在使用materialDatePicker,但发现很难为打开的datePicker设置minDate和maxDate属性.我正在打开日期选择器,以在2个不同的文本字段中选择开始日期和结束日期以添加特定时间段.不,我不想选择一个远程日期.我已经研究过了,它不符合我的要求.我可以使用

I am using materialDatePicker in while developing my application and I am finding it difficult in setting the minDate and maxDate properties for the datePicker opened. I am opening date picker to select a start date and an end date in 2 different text fields for adding a particular period. No, I don't want to select a ranged date. I have looked into this and it does not suit my requirement. I can set a maxDate using

calendarConstraints.setValidator(DateValidatorPointForward.from(startDate)) 

但是我不能使用materialDatePicker选择一个minDate.

but I can not select a minDate using the 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());

推荐答案

您可以创建一个自定义的 CalendarConstraints.DateValidator 类,该类接受一个最小和最大日期,并通过重写 isValid来验证它们()方法,该方法返回一个布尔值,该布尔值指示将在屏幕上显示的特定日期是否有效.

You can create a custom CalendarConstraints.DateValidator class that takes a minimum and maximum dates, and validates them by overrriding isValid() method which returns a boolean that indicates whether a certain date that will be displayed on the screen is valid or not.

下面是一个完整的示例,它选择的日期为2020年2月15日至2020年3月20日.

Here is a full example that selects dates from 15/02/2020 to 20/03/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];
            }
        };


    }

}

这篇关于在android studio中的Material Date Picker中禁用日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆