如何在Android材质日历中禁用日期

如何在Android材质日历中禁用日期,android,Android,我正在使用MaterialCalendarView和基于日期的数组CalendarView突出显示日期。所以我想禁用日期数组之外的日期 datePickerDialog = new Dialog(MainActivity.getInstance()); datePickerDialog.show(); datePickerDialog.getWindow().setFlags(WindowManager.Layou

我正在使用Material
CalendarView
和基于日期的数组
CalendarView
突出显示日期。所以我想禁用日期数组之外的日期

 datePickerDialog = new Dialog(MainActivity.getInstance());
                    datePickerDialog.show();
                    datePickerDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                    datePickerDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                    datePickerDialog.setCancelable(true);
                    datePickerDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
                    datePickerDialog.setContentView(R.layout.assignment_custom_datepicker);
                    materialCalendarView = (MaterialCalendarView) datePickerDialog.findViewById(R.id.calendarView);
                  //  materialCalendarView.setShowOtherDates(MaterialCalendarView.SHOW_ALL);
                    materialCalendarView.setFirstDayOfWeek(Calendar.SUNDAY);
                    materialCalendarView.invalidate();

                    materialCalendarView.setHeaderTextAppearance(R.style.TextAppearance_AppCompat_Medium);
                    materialCalendarView.setDateTextAppearance(R.drawable.background_solid_blue);
                    materialCalendarView.setDateTextAppearance(R.style.TextAppearance_AppCompat_Medium);
                    materialCalendarView.setWeekDayTextAppearance(R.style.TextAppearance_AppCompat_Medium);
                    materialCalendarView.setSelectionMode(MaterialCalendarView.SELECTION_MODE_SINGLE);

                  //  materialCalendarView.setWeekDayTextAppearance();
                    materialCalendarView.setDateTextAppearance(R.style.WalletFragmentDefaultButtonTextAppearance);
                    Calendar selectDayCalendar = Calendar.getInstance();
                    selectDayCalendar.set(mYear, mMonth, mDay);
                    materialCalendarView.addDecorators(
                            new OneDayDecorator()
                    );
                    if (calendarDays != null && !calendarDays.isEmpty() ) {
                        materialCalendarView.addDecorator(new EventDecorator(Color.RED, calendarDays));
                        materialCalendarView.setOnDateChangedListener(this);


                    }
                    else
                    {
                        // materialCalendarView.setOnDateChangedListener(this);
                    }
                    if (readcalendarDays != null && !readcalendarDays.isEmpty()) {
                        materialCalendarView.addDecorator(new EventDecorator(Color.GREEN, readcalendarDays));

                    }
请尝试以下操作:

ArrayList<CalendarDay> enabledDates = new ArrayList<>();

//Some for loop on dates{
    enabledDates.add(new CalendarDay(date));
}

materialCalendarView.addDecorator(calendarDecorator.new DayEnableDecorator(enabledDates));

这将启用您在数组中输入的日期
enabledDates
并禁用其余日期

,因为目前,Ankur Aggarwal提供的答案不起作用-这是我的解决方案

接受的答案将不起作用,因为默认情况下,MaterialCalendarView中的所有天都处于启用状态

首先,我们必须禁用
MaterialCalendarView
中的所有日期

public class AllDaysDisabledDecorator implements DayViewDecorator {

        @Override
        public boolean shouldDecorate(CalendarDay day) {
            return true; //decorate all days in calendar
        }

        @Override
        public void decorate(DayViewFacade view) {
            view.setDaysDisabled(true); //disable all days
        }
   }
并将此装饰器添加到
MaterialCalendarView

materialCalendarView.addDecorator(new AllDaysDisabledDecorator());
之后,我们必须添加另一个decorator,但对于可用和启用的日期(如接受的答案中所示):


因此,在完成这些简单的操作之后,您将只启用和禁用所需的天数

谢谢Ankur Aggarwal的回复。对于禁用日期,物料日历中是否有任何方法。实际上基于ArrayList启用了日期,但用于禁用面临问题的日期。@Ravi没有单独的装饰程序来禁用日期。
MaterialCalendarView
的工作原理是,如果所有日期不在
enabledDates
列表中,它将自动禁用这些日期。我总是用这个,从来没有遇到过麻烦problem@Ravi编辑了我的答案。现在尝试此plzBut calendarDecorator显示错误。这是内置方法。如何禁用特定日期
materialCalendarView.addDecorator(new AllDaysDisabledDecorator());
public class AvailableDaysDecorator implements DayViewDecorator {

        private final int color;
        private final HashSet<CalendarDay> dates;

        AvailableDaysDecorator(int color, Collection<CalendarDay> dates) {
            this.color = color;
            this.dates = new HashSet<>(dates);
        }

        @Override
        public boolean shouldDecorate(CalendarDay day) {
            return dates.contains(day); //decorate only available days
        }

        @Override
        public void decorate(DayViewFacade view) {
            view.setDaysDisabled(false); ///important to enable day
            view.addSpan(new DotSpan(5, color)); //adds small dot to bottom of day number text
        }
    }
materialCalendarView.addDecorator(new AvailableDaysDecorator(R.color.colorPrimary, days));