You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android日历视图如何为日期添加自定义颜色(考勤场景)

解决zcustomcalendar依赖错误及考勤日期状态标记问题

一、修复依赖解析错误

出现Failed to resolve: org.naishadhparmar.zcustomcalendar:zcustomcalendar:1.0.1错误,按以下步骤排查解决:

  1. 检查仓库配置
    确保项目的settings.gradle文件中添加了mavenCentral()仓库(该库托管在Maven Central):

    dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            google()
            mavenCentral()
            // 若仍有问题可临时添加jcenter(),但jcenter已废弃,优先用mavenCentral
            // jcenter()
        }
    }
    
  2. 更新依赖版本
    1.0.1版本可能已停止维护,建议替换为最新稳定版本,例如:

    implementation 'org.naishadhparmar.zcustomcalendar:zcustomcalendar:1.1.0'
    
  3. 同步项目
    修改配置后点击Android Studio右上角的"Sync Project with Gradle Files"按钮,重新同步依赖。


二、实现出勤/缺勤日期颜色标记

依赖问题解决后,按以下步骤配置日历,用红绿颜色区分出勤(Present)和缺勤(Absent)状态:

1. 定义状态属性

在res/values/attrs.xml中添加自定义状态属性,用于触发背景颜色切换:

<declare-styleable name="CalendarDateStates">
    <attr name="state_present" format="boolean"/>
    <attr name="state_absent" format="boolean"/>
</declare-styleable>

2. 创建日期项布局

新建res/layout/calendar_date_item.xml,作为单个日期的显示视图:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dp"
    android:textSize="16sp"
    android:background="@drawable/calendar_date_bg" />

3. 编写背景颜色选择器

新建res/drawable/calendar_date_bg.xml,根据状态切换背景色:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/green" android:state_present="true"/>
    <item android:drawable="@color/red" android:state_absent="true"/>
    <item android:drawable="@color/white"/> <!-- 默认无状态的背景色 -->
</selector>

4. 配置日历并绑定状态数据

在Activity/Fragment中初始化ZCustomCalendar,设置状态规则和日期数据:

import org.naishadhparmar.zcustomcalendar.ZCustomCalendar;
import org.naishadhparmar.zcustomcalendar.State;
import org.naishadhparmar.zcustomcalendar.StateConfiguration;

// 定义状态常量
private static final String STATE_PRESENT = "present";
private static final String STATE_ABSENT = "absent";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ZCustomCalendar calendar = findViewById(R.id.calendar);

    // 配置各状态的视图规则
    StateConfiguration stateConfig = new StateConfiguration();

    // 出勤状态配置
    stateConfig.addState(STATE_PRESENT, new State() {
        @Override
        public int getLayoutResourceId() {
            return R.layout.calendar_date_item;
        }

        @Override
        public void setView(View view, Calendar calendarDate, String state, boolean isSelected) {
            TextView tvDate = view.findViewById(R.id.tv_date);
            tvDate.setText(String.valueOf(calendarDate.get(Calendar.DAY_OF_MONTH)));
            // 标记当前状态,触发选择器颜色
            view.setTag(R.id.state_present, true);
        }
    });

    // 缺勤状态配置
    stateConfig.addState(STATE_ABSENT, new State() {
        @Override
        public int getLayoutResourceId() {
            return R.layout.calendar_date_item;
        }

        @Override
        public void setView(View view, Calendar calendarDate, String state, boolean isSelected) {
            TextView tvDate = view.findViewById(R.id.tv_date);
            tvDate.setText(String.valueOf(calendarDate.get(Calendar.DAY_OF_MONTH)));
            view.setTag(R.id.state_absent, true);
        }
    });

    // 默认无状态配置
    stateConfig.setDefaultState(new State() {
        @Override
        public int getLayoutResourceId() {
            return R.layout.calendar_date_item;
        }

        @Override
        public void setView(View view, Calendar calendarDate, String state, boolean isSelected) {
            TextView tvDate = view.findViewById(R.id.tv_date);
            tvDate.setText(String.valueOf(calendarDate.get(Calendar.DAY_OF_MONTH)));
        }
    });

    // 应用状态配置到日历
    calendar.setStateConfiguration(stateConfig);

    // 准备日期-状态映射数据(替换为你的实际考勤数据)
    HashMap<Calendar, String> dateStateMap = new HashMap<>();

    // 示例:设置2024年5月10日为出勤
    Calendar presentDate = Calendar.getInstance();
    presentDate.set(2024, Calendar.MAY, 10);
    dateStateMap.put(presentDate, STATE_PRESENT);

    // 示例:设置2024年5月11日为缺勤
    Calendar absentDate = Calendar.getInstance();
    absentDate.set(2024, Calendar.MAY, 11);
    dateStateMap.put(absentDate, STATE_ABSENT);

    // 将数据绑定到日历
    calendar.setDateStateMap(dateStateMap);
}

5. 添加日历到布局

在主布局文件(如activity_main.xml)中添加ZCustomCalendar控件:

<org.naishadhparmar.zcustomcalendar.ZCustomCalendar
    android:id="@+id/calendar"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

内容的提问来源于stack exchange,提问作者Jebas Winston

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:25:19