jjzjj

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

coder 2023-11-21 原文

我的目标是找到一个 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 - material-calendarview 设置日期的背景色的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  7. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

    我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

  8. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  9. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  10. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

随机推荐