matériel-calendarview définir la couleur de fond de dates
Mon objectif est de trouver un Android de bibliothèque qui me permet de marquer les différentes dates d'un calendrier basé sur un tableau. Les dates peuvent ou peuvent ne pas être contigus. Mon scénario idéal est de changer la couleur de fond de chaque jour. La principale complication est que je ne connais pas cette couleur jusqu'à l'exécution, car il va venir à partir d'un serveur de requête.
J'ai fait des recherches toute la journée, et mon meilleur espoir semble être material-calendarview
(github). Cependant, je trouve que leur code soit un peu impénétrable, qui est sur moi, mais je suis complètement bloqué.
J'ai ajouté un calendrier comme ça dans mon XML mise en page:
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:mcv_showOtherDates="all"
app:mcv_selectionColor="#00F"/>
Et puis dans mon activité, j'ai ces variables d'instance:
private MaterialCalendarView calendarView;
private ArrayList<Date> markedDates;
et ce code dans mon onCreateView()
calendarView = (MaterialCalendarView) view.findViewById(R.id.calendar_view);
Ok, assez facile. Mais je ne peux pas comprendre comment marquer le calendrier de mon tableau de dates. Je suis en train de travailler sur cette méthode, mais je ne sais pas comment aller au-delà de ce que j'ai ici:
private void initializeCalendar() {
calendarView.setOnDateChangedListener(context);
calendarView.setShowOtherDates(MaterialCalendarView.SHOW_ALL);
Calendar calendar = Calendar.getInstance();
calendarView.setSelectedDate(calendar.getTime());
calendar.set(calendar.get(Calendar.YEAR), Calendar.JANUARY, 1);
calendarView.setMinimumDate(calendar.getTime());
calendar.set(calendar.get(Calendar.YEAR), Calendar.DECEMBER, 31);
calendarView.setMaximumDate(calendar.getTime());
int bgColor = sharedVisualElements.getPrimaryColor();
calendarView.addDecorators(new EventDecorator(bgColor, ????));
}
Que la dernière ligne fait référence à cette intérieure:
private class EventDecorator implements DayViewDecorator {
private final int color;
private final HashSet<CalendarDay> dates;
public EventDecorator(int color, Collection<CalendarDay> dates) {
this.color = color;
this.dates = new HashSet<>(dates);
}
@Override
public boolean shouldDecorate(CalendarDay day) {
return dates.contains(day);
}
@Override
public void decorate(DayViewFacade view) {
view.addSpan(new DotSpan(5, color));
}
}
Je pense que mon défi pour convertir mes ArrayList<Date> markedDates
à ce qu'ils appellent Collection<CalendarDay> dates
. D'accord? Mais c'est là que j'ai vraiment ralentir. Cette structure de données est bizarre pour moi. Lorsque j'essaie d'instancier en appelant new CalendarDay()
ma classe immédiatement s'agrandit avec environ 10 nouvelles méthodes que je ne comprends pas leur rôle ou quoi faire avec eux. Clairement, je vais sur les rails d'ici. Il ne peut tout simplement pas être cette délicate.
Quelqu'un a utilisé cette bibliothèque à cette fin et de savoir comment accomplir cette tâche? Je suis à une halte de meulage. Aussi, si il est plus simple de la bibliothèque pour me permettre de définir des couleurs d'arrière-plan à l'aide d'une seule couleur connus au moment de l'exécution, je suis tout ouïe.
Merci pour toute aide. J'ai peur de ce que j'ai écrit cela dans une manière confuse, ce qui est un résultat du fait que je suis complètement déconcerté.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez changer la couleur d'arrière-plan de la sélection par programmation, utilisez cette méthode:-
En utilisant ce code permet de tous les sélecteurs de la même couleur, donc si vous voulez avoir une couleur différente, les sélecteurs en fonction de votre état, utilisez-décorateur()
J'ai résolu ce problème, donc je vais poster la solution dans le cas où quelqu'un d'autre a la même question. Si il y a un moyen plus efficace, merci de poster comme une solution.
Je l'ai mentionné que j'ai un tableau avec une liste de dates. Ce dont j'ai besoin pour faire est d'itérer sur ce tableau, la conversion de chaque
Date
dans unCalendar
ensemble de l'objet à la appropriée de l'année, le mois et le jour, puis ajouter cet objet à un autreArrayList
, cette fois, uneArrayList<CalendarDay>
. Par exemple:Alors maintenant, nous avons cette liste de
CalendarDay
objets, mais nous ne sommes pas tout à fait là. La dernière étape dans la création de la structure de données est de "convertir" à ce que j'ai mentionné, j'ai été aux prises avec dans l'OP - unCollection<CalendarDay>
structure. S'avère que ce ne pouvait pas être plus simple une fois que nous avons ici. Il suffit d'assigner comme ceci:Et puis quand vous voulez pour ajouter le décorateur, vous êtes tous mis en place. Faites simplement ceci:
Une autre chose est à noter, et cela a été une source majeure de ma confusion. Je ne comprenais pas comment instancier cette
Collection<CalendarDay>
objet. Dans la variable d'instance de la section (avant que le constructeur), j'ai ajouté ce code, presque tous Android Studio rempli pour moi:J'espère que cela aide quelqu'un. Encore une fois, si il y a une meilleure solution, s'il vous plaît poster et je vais supprimer le mien.
Pourquoi avez-vous utilisé la liste de tableaux au lieu de le HashSet ?
La raison pour laquelle vous ne peut pas instancier Collection est parce que c'est une interface, d'où vous avez eu à créer de la classe anonyme et surcharger les méthodes.
Voici comment j'ai fait quelque chose de similaire:
Cette méthode prend en deux Calendrier des objets et ajoute tous les jours entre les deux dates de Calendrier en un HashSet de CalendarDays.
sur le onCreateView(...) la méthode,j'ai défini dynamiquement les deux dates du calendrier, la différence entre ce qui sera stocké dans le HashSet. Toutefois, vous pouvez passer votre propre ensemble aléatoire de dates dans le HashSet.
Dans mon cas BookingDecorator est la classe qui implémente l'DayViewDecorator interface.
Votre post a été très utile. Espérons que la mienne aide quelqu'un ainsi.