当前位置: 首页 > 知识库问答 >
问题:

材料-日历视图设置日期的背景颜色

宗政卓
2023-03-14

我的目标是找到一个Android库,它允许我基于数组在日历视图上标记各种日期。日期可能是连续的,也可能不是连续的。我的理想方案是更改每个日期的背景色。重要的复杂性是,我直到运行时才知道这个颜色,因为它来自服务器查询。

我一整天都在研究这个,我最大的希望似乎是coport-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"/>

然后在我的活动中,我有以下实例变量:

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

有没有人为此目的使用这个库并知道如何完成这项任务?我在一个痛苦的停顿。此外,如果有一个更简单的库允许我使用只在运行时知道的颜色设置背景颜色,我洗耳恭听。

谢谢你的帮助。我担心我写这篇文章的方式令人困惑,这是我完全困惑的结果。


共有3个答案

郭兴平
2023-03-14

为什么使用ArrayList而不是HashSet?无法实例化集合的原因是因为它是一个接口,因此必须创建匿名类并重写方法。

下面是我做类似事情的方式:

此方法接收两个日历对象,并将两个日历日期之间的所有日期添加到一组日历日期中。

private HashSet<CalendarDay> getCalendarDaysSet(Calendar cal1, Calendar cal2) {
    HashSet<CalendarDay> setDays = new HashSet<>();
    while (cal1.getTime().before(cal2.getTime())) {
        CalendarDay calDay = CalendarDay.from(cal1);
        setDays.add(calDay);
        cal1.add(Calendar.DATE, 1);
    }

    return setDays;
}

在onCreateView(...)方法中,我已经动态设置了两个日历日期,它们之间的差异将存储在HashSet中。但是,您可以在HashSet中传递自己的随机日期集。

Calendar cal1 = Calendar.getInstance();
    cal1.set(2016, 8, 1);
    Calendar cal2 = Calendar.getInstance();
    cal2.set(2016, 9, 1);

    HashSet<CalendarDay> setDays = getCalendarDaysSet(cal1, cal2);
    int myColor = R.color.red;
    mCalendarView.addDecorator(new BookingDecorator(myColor, setDays));

在我的例子中,BookingDecorator是实现DayViewDecorator接口的类。

 private class BookingDecorator implements DayViewDecorator {
    private int mColor;
    private HashSet<CalendarDay> mCalendarDayCollection;

    public BookingDecorator(int color, HashSet<CalendarDay> calendarDayCollection) {
        mColor = color;
        mCalendarDayCollection = calendarDayCollection;
    }

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

    @Override
    public void decorate(DayViewFacade view) {
        view.addSpan(new ForegroundColorSpan(mColor));
        //view.addSpan(new BackgroundColorSpan(Color.BLUE));
        view.setBackgroundDrawable(ContextCompat.getDrawable(getContext(),R.drawable.greenbox));

    }
}

你的帖子很有帮助。希望我的也能帮助别人。

汪德寿
2023-03-14

如果要以编程方式更改选定对象的背景色,请使用以下方法:-

MaterialCalendarView materialCalendar = (MaterialCalendarView)findViewById(R.id.materialCalenderView);
materialCalendar.setSelectionColor(Color.parseColor("#00BCD4"));

使用此代码可以使所有选择器具有相同的颜色,因此如果您希望根据您的条件使用不同的颜色选择器,请使用decorator()

曾晨
2023-03-14

我解决了这个问题,所以我会发布这个解决方案,以防其他人有同样的问题。如果有更有效的方法,请发布解决方案。

我提到我有一个日期列表数组。我需要做的是迭代这个数组,将每个Date转换成一个设置为适当的年、月和日的Calender对象,然后将该对象添加到不同的ArrayList中一个ArrayList

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-a集合中提到的内容

calendarDays = list;

然后,当你想添加装饰,你都设置好了。只要这样做:

calendarView.addDecorators(new EventDecorator(myColor, calendarDays));

还有一件事值得一提,这是我困惑的主要原因。我不明白如何实例化这个集合

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

我希望这能帮助到某人。同样,如果有更好的解决方案,请发帖,我会删除我的。

 类似资料:
  • 但我可以改变它 我指望你的帮助

  • 问题内容: 在android中,我正在使用默认的CalendarView。我将背景设置为浅灰色。但是我可以更改日历视图的月视图的颜色吗? 问题答案: 正如您所发现的,TextView是私有的,似乎没有任何访问它的方法。 尽管我不推荐这样做,但是您可以使用以下程序包来完成此操作:

  • 在android中,我使用的是默认的日历视图。我已将背景设置为浅灰色。但是我可以改变日历视图的月份视图的颜色吗?

  • 通过RGB值设置背景的颜色。 默认的颜色是 0x000000: // 颜色的参数可以是字符串 "#530000" 或者是十六进制数值 0x530000 controller.setBackgroundColor("#530000); //controller.setBackgroundColor(0x530000);

  • 一个多星期以来,我一直在stackoverflow和许多其他网站上搜索,想找到一种方法,在包含事件的日历视图中为某些日期着色,但运气不佳。文档中描述的唯一颜色变化是聚焦日期和聚焦周的颜色变化。 我得到了一个带有setOnDateChangeListener的CalendarView,它打开了一个对话框片段,用户可以在其中添加信息并将其保存到数据库中。我想从数据库中提取带有信息的日期,并将这些日期显

  • 问题内容: 我已经开发了一个Java Swing应用程序。 如何设置特定JDayChooser日期的背景颜色? 谢谢 问题答案: 终于找到了解决方法:D