我的目标是找到一个 Android 库,它允许我在基于数组的日历 View 上标记不同的日期。日期可能连续也可能不连续。我理想的场景是改变每个日期的背景颜色。重要的并发症是我直到运行时才知道这种颜色,因为它将来自服务器查询。
我整天都在研究这个,我最大的希望似乎是 material-calendarview
(github)。但是,我发现他们的代码有些难以理解,这是我的错,但我完全被困住了。
我在我的 XML 布局中添加了这样的日历:
<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"/>
然后在我的 Activity 中,我有这些实例变量:
private MaterialCalendarView calendarView;
private ArrayList<Date> markedDates;
还有我的 onCreateView()
中的这段代码
calendarView = (MaterialCalendarView) view.findViewById(R.id.calendar_view);
好的,很简单。但我无法弄清楚如何从我的日期数组中标记日历。我正在研究这种方法,但我只是不知道如何进行超出我这里的方法:
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, ????));
}
最后一行指的是这个内部类:
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));
}
}
我认为我的挑战是转换我的 ArrayList<Date> markedDates
他们称之为Collection<CalendarDay> dates
.同意?但这是我真正陷入困境的地方。这data structure对我来说很奇怪。当我尝试通过调用 new CalendarDay()
来实例化它时我的类(class)立即扩展了大约 10 个我不了解它们的作用或如何处理它们的新方法。显然,我在这里偏离了轨道。它不可能这么棘手。
有没有人为此目的使用过这个库并且知道如何完成这个任务?我快要停下来了。此外,如果有一个更简单的库允许我使用仅在运行时已知的颜色来设置背景颜色,我会洗耳恭听。
感谢您的帮助。我担心我以一种困惑的方式写了这篇文章,这是我完全糊涂的结果。
最佳答案
我解决了这个问题,所以我会发布该解决方案以防其他人有同样的问题。如果有更有效的方法,请发布作为解决方案。
我提到我有一个包含日期列表的数组。我需要做的是遍历该数组,转换每个 Date
进入 Calendar
对象设置为适当的年月日,然后将该对象添加到不同的 ArrayList
, 这次是 ArrayList<CalendarDay>
.例如:
List<CalendarDay> list = new ArrayList<CalendarDay>();
Calendar calendar = Calendar.getInstance();
for (Date date : markedDates) {
// might be a more elegant way to do this part, but this is very explicit
int year = date.getYear();
int month = date.getMonthOfYear() - 1; // months are 0-based in Calendar
int day = date.getDayOfMonth();
calendar.set(year, month, day);
CalendarDay calendarDay = CalendarDay.from(calendar);
list.add(calendarDay);
}
现在我们得到了 CalendarDay
的列表对象,但我们还不完全在那里。创建数据结构的最后一步是将其“转换”为我提到的我在 OP 中遇到的问题 - Collection<CalendarDay>
结构体。事实证明,一旦我们到达这里,这就再简单不过了。只需像这样分配它:
calendarDays = list;
然后,当您想要添加装饰器时,一切就都准备就绪了。只需这样做:
calendarView.addDecorators(new EventDecorator(myColor, calendarDays));
还有一件事值得一提,这是我困惑的主要原因。我不明白如何实例化这个 Collection<CalendarDay>
目的。在实例变量部分(在构造函数之前),我添加了这段代码,Android Studio 为我填充了几乎所有代码:
private Collection<CalendarDay> calendarDays = new Collection<CalendarDay>() {
@Override
public boolean add(CalendarDay object) {
return false;
}
@Override
public boolean addAll(Collection<? extends CalendarDay> collection) {
return false;
}
@Override
public void clear() {
}
@Override
public boolean contains(Object object) {
return false;
}
@Override
public boolean containsAll(Collection<?> collection) {
return false;
}
@Override
public boolean isEmpty() {
return false;
}
@NonNull
@Override
public Iterator<CalendarDay> iterator() {
return null;
}
@Override
public boolean remove(Object object) {
return false;
}
@Override
public boolean removeAll(Collection<?> collection) {
return false;
}
@Override
public boolean retainAll(Collection<?> collection) {
return false;
}
@Override
public int size() {
return 0;
}
@NonNull
@Override
public Object[] toArray() {
return new Object[0];
}
@NonNull
@Override
public <T> T[] toArray(T[] array) {
return null;
}
};
希望对大家有所帮助。再一次,如果有更好的解决方案,请发布,我会删除我的。
关于java - material-calendarview 设置日期的背景色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512727/