java - material-calendarview 设置日期的背景色

标签 java android calendar

我的目标是找到一个 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/

相关文章:

java - 首先是 InjectableProvider 还是 ExceptionMapper?

java - 如何从 REST 客户端的实体中公开 JAX-RS "DTO"?

Android M 应用程序更新和同步适配器权限

android - 更新支持库的最佳方式

java - 如何从php获取json数组并在android中使用它的值?

jquery - Input-group-addon 元素不会触发日期类

javascript - 附加到路径的文本不显示

java - Hadoop 错误 : Could not find or load main class class path TestJava

java - 是否可以与依赖项目共享构建 Maven 配置文件属性

android - 由于 MOOV 原子相同,无法连接视频