2016-06-06 11 views
1

Ich verwende Material CalendarView und basierend auf von Daten CalenderView Hervorhebung Daten. Daher möchte ich die Daten außer Array of Dates deaktivieren.So deaktivieren Sie Daten in Android Material Kalender

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

        } 

Antwort

1

Versuchen Sie Folgendes:

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

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

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

Die DayEnableDecorator ist eine eigene Klasse:

public class DayEnableDecorator implements DayViewDecorator{ 
    private HashSet<CalendarDay> dates; 

    public DayEnableDecorator(Collection<CalendarDay> dates) { 
     this.dates = new HashSet<>(dates); 
    } 

    @Override 
    public boolean shouldDecorate(CalendarDay day) { 
     return dates.contains(day); 
    } 

    @Override 
    public void decorate(DayViewFacade view) { 
     view.setDaysDisabled(false); 
    } 
} 

Dies würde die Daten ermöglichen, die Sie in dem Array setzen enabledDates und deaktivieren Sie den Rest

+1

Vielen Dank, Ankur Aggarwal für die Antwort. Zum Deaktivieren von Daten gibt es Methoden im Materialkalender. Das Datum wurde tatsächlich basierend auf ArrayList aktiviert, aber um Daten zu deaktivieren, die auf Probleme stoßen. – Ravi

+0

@Ravi gibt es keinen separaten Dekorator, um Daten zu deaktivieren. Wie 'MaterialCalendarView' funktionieren würde, ist, dass es alle Daten automatisch deaktiviert, wenn sie nicht in der" enabledDates "-Liste sind. Ich benutze das immer und habe kein Problem –

+0

@Ravi Bearbeitete meine Antwort. Jetzt versuchen Sie diese PLZ –

1

Weil für jetzt, antworte das zur Verfügung gestellt von Ankur Aggarwal funktioniert nicht - hier ist meine Lösung.

Akzeptierte Antwort wird nicht funktionieren, da standardmäßig in MaterialCalendarView alle Tage im aktivierten Zustand.

Zuerst müssen wir alle Daten in MaterialCalendarView deaktivieren.

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 
     } 
    } 

und fügen Sie diese Dekorateur MaterialCalendarView:

materialCalendarView.addDecorator(new AllDaysDisabledDecorator()); 

Danach haben wir einen weiteren Dekorateur hinzufügen müssen, aber für verfügbar und aktiviert Daten (wie in akzeptierte Antwort):

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 
     } 
    } 

Und fügen Sie diesen zweiten Dekorateur hinzu:

materialCalendarView.addDecorator(new AvailableDaysDecorator(R.color.colorPrimary, days)); 

Also, nach diesen einfachen Aktionen, werden Sie nur benötigte Tage aktiviert und alle anderen Tage deaktiviert.

Verwandte Themen