Android日历视图如何为日期添加自定义颜色(考勤场景)
解决zcustomcalendar依赖错误及考勤日期状态标记问题
一、修复依赖解析错误
出现Failed to resolve: org.naishadhparmar.zcustomcalendar:zcustomcalendar:1.0.1错误,按以下步骤排查解决:
检查仓库配置
确保项目的settings.gradle文件中添加了mavenCentral()仓库(该库托管在Maven Central):dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // 若仍有问题可临时添加jcenter(),但jcenter已废弃,优先用mavenCentral // jcenter() } }更新依赖版本
1.0.1版本可能已停止维护,建议替换为最新稳定版本,例如:implementation 'org.naishadhparmar.zcustomcalendar:zcustomcalendar:1.1.0'同步项目
修改配置后点击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
相关产品推荐
相关产品推荐

