android实现上班打卡记录日历查看功能

更新了项目,适合按月渲染打卡记录(使用看使用技巧):calendarview.zip-互联网文档类资源-CSDN下载

 项目地址(打卡记录要初始化前一次全部渲染出来): CalendarView.zip_CalendarView-互联网文档类资源-CSDN下载

日历实现查看打卡记录功能:

功能:

  • 1、支持农历、节气、常用节假日
  • 2、日期范围设置,默认支持的最大日期范围[1900.1~2049.12]
  • 3、禁用日期范围设置
  • 4、初始化选中单个或多个日期
  • 5、单选、多选操作
  • 6、跳转到指定日期
  • 7、替换农历为指定文字
  • 8、通过自定义属性定制日期外观,以及简单的日期item布局配置
  • 9、新增查看打卡记录功能;(在原来基础上新增了查看打卡记录功能,包含打卡正常和打卡异常)

 预览:

 基本用法:

注意:日历使用了viewpager进行了每月的详情展示,viewpager会预加载相邻页面(calendarView.setOffscreenPageLimit(0)),我是每月的打卡记录请求接口获取,viewpager这种预加载会造成打卡记录的圆点的渲染失败,所以我就自定义了viewpager和PagerAdapter,主要是为了禁止预加载,以及禁用了viewpager的侧向滑动功能,只能通过顶部选择年月后去请求接口,然后渲染打卡记录的圆点(已经重写了viewpager和pageradapter的项目已经上传平台:calendarview.zip-互联网文档类资源-CSDN下载);

使用技巧:

设置一个boolean判断是否是日历初始化 private boolean isCalendarInit = false;
HashMap<String, String> clockStatusMap = new HashMap<>();//日历中需要渲染的日期集合

clockStatusMap .put("2020.7.11", "true");   2020年7月11日  true-打卡正常,灰色点 ,默认就是正常,可不填,7月不能用07月

calendarView.setClockInStatus(clockStatusMap);//接口获取当月的打卡记录集合,处理数据后放入日历

if (!isCalendarInit) {//第一次初始化日历,一定要等把打卡记录放到日历集合后进行初始化,不然会造成渲染失败
    isCalendarInit = true;
    calendarView
            .setStartEndDate("2016.1", "2028.12")
            .setDisableStartEndDate("2016.1.1", "2028.12.31")
            .setInitDate(cDate[0] + "." + cDate[1])
            .setSingleDate(cDate[0] + "." + cDate[1] + "." + cDate[2])
            .init();
} else {//已经完成初始化后,选择年月,日历去切换年月并进行渲染

    calendarView.toDestDate(Integer.parseInt(year), Integer.parseInt(month), 0);
}

详细的使用方法见下面:

Step 1. 添加JitPack仓库 在当前项目等根目录下的 build.gradle 文件中添加如下内容:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

Step 2. 添加项目依赖(在源码基础上进行了扩展,需要直接把源码放到本地添加依赖

下载项目到本地:

添加依赖到你的项目: 

Step 3. 在布局文件中添加WeekView、CalendarView

<com.othershe.calendarview.weiget.WeekView
        android:layout_width="match_parent"
        android:layout_height="35dp" />
        
<com.othershe.calendarview.weiget.CalendarView
        android:id="@+id/calendar"
        android:layout_width="match_parent"
        android:layout_height="220dp" />

Step 4. 相关初始化

CalendarView calendarView = (CalendarView) findViewById(R.id.calendar);
//日历init,年月日之间用点号隔开
calendarView
        .setStartEndDate("2010.7", "2018.12")
        .setInitDate("2017.11")
        .setSingleDate("2017.12.12")
        .init();

//月份切换回调
calendarView.setOnPagerChangeListener(new OnPagerChangeListener() {
            @Override
            public void onPagerChanged(int[] date) {
                
            }
        });
        
//单选回调
calendarView.setOnItemClickListener(new OnMonthItemClickListener() {
            @Override
            public void onMonthItemClick(View view, DateBean date) {
                
            }
        });

CalendarView相关方法

新增方法 setClockInStatus(HashMap<String, String>   map)

{设置日历的打卡状态 例如:

HashMap<String, String> map = new HashMap<>();
map.put("2020.7.11", "true");   2020年7月11日  true-打卡正常,灰色点 ,默认就是正常,可不填
map.put("2020.7.6", "false");   2020年7月6日 false-打卡异常,红色点 ,默认就是正常,可不填

//map中没有增加的日期,默认没有打卡

calendarView.setClockInStatus(map);

}

方法名描述
setInitDate(String date)设置日历的初始显示年月
setStartEndDate(String startDate, String endDate)设置日历开始、结束年月
setDisableStartEndDate(String startDate, String endDate)设置日历的禁用日期范围(小于startDate、大于endDate禁用)
setSpecifyMap(HashMap<String, String> map)将显示农历的区域替换成指定文字
setSingleDate(String date)设置单选时初始选中的日期(不设置则不默认选中)
getSingleDate()得到单选时选中的日期
setMultiDate(List dates)设置多选时默认选中的日期集合
getMultiDate()得到多选时选中的全部日期
toSpecifyDate(int year, int month, int day)单选时跳转到指定年月日
setOnCalendarViewAdapter(int layoutId, CalendarViewAdapter adapter)设置自定义日期item样式
init()日期初始化(以上属性配置完后调用)
setOnPagerChangeListener(OnPagerChangeListener listener)设置月份切换回调
setOnSingleChooseListener(OnSingleChooseListener listener)设置单选回调
setOnMultiChooseListener(OnMultiChooseListener listener)设置多选回调
today()单选时跳转到今天
nextMonth()跳转到下个月
lastMonth()跳转到上个月
nextYear()跳转到下一年的当前月
lastYear()跳转到上一年的当前月
toStart()跳转到日历的开始年月
toEnd()跳转到日历的结束年月
CalendarUtil.getCurrentDate()获得当前日期(今天)

CalendarView的自定义属性

namespace:xmlns:calendarview="http://schemas.android.com/apk/res-auto"

属性名格式描述默认值
choose_typeenum设置单选(single)、多选(multi)single
show_lunarboolean是否显示农历true
show_last_nextboolean是否在MonthView显示上月和下月日期true
show_holidayboolean是否显示节假日true
show_termboolean是否显示节气true
switch_chooseboolean单选时切换月份,是否选中上次的日期true
solar_colorcolor阳历日期的颜色
solar_sizeinteger阳历的日期尺寸14
lunar_colorcolor农历的日期颜色
lunar_sizeinteger农历的日期尺寸8
holiday_colorcolor节假日、节气的颜色
choose_colorcolor选中的日期颜色
day_bgreference选中的日期背景(图片)

WeekView的自定义属性

namespace:xmlns:weekview="http://schemas.android.com/apk/res-auto"

属性名格式描述默认值
week_strstring周的表示形式,用点隔开(例如:日.一.二.三.四.五.六)
week_colorcolor周的颜色
week_sizeinteger周的尺寸12

我只是在别的开源框架进行了扩展

感谢原作者:GitHub - SheHuan/CalendarView: Android 自定义日历控件

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现日历打卡显示用户的功能,可以使用 HTML、JavaScript 和 CSS。以下是一种实现方式: 1. 首先,需要一个日历的 HTML 页面。可以使用 table 元素来创建一个简单的日历表格。 ```html <table> <thead> <tr> <th>周日</th> <th>周一</th> <th>周二</th> <th>周三</th> <th>周四</th> <th>周五</th> <th>周六</th> </tr> </thead> <tbody> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <!-- 其他行省略 --> </tbody> </table> ``` 2. 接下来,需要使用 JavaScript 代码动态地向日历表格中添加日期。可以使用 Date 对象来获取当前日期及其对应的星期几,然后将它们添加到表格中。 ```javascript const date = new Date(); const year = date.getFullYear(); const month = date.getMonth() + 1; const today = date.getDate(); const firstDay = new Date(year, month - 1, 1).getDay(); // 本月第一天是星期几 const tbody = document.querySelector('tbody'); let row = tbody.insertRow(); // 插入一行 for (let i = 0; i < firstDay; i++) { row.insertCell(); // 插入空单元格 } for (let i = 1; i <= getDaysInMonth(year, month); i++) { const cell = row.insertCell(); cell.textContent = i; if (i === today) { cell.classList.add('today'); // 突出显示今天的日期 } // TODO: 根据用户打卡记录,修改单元格的样式 if (hasPunchedIn(i)) { cell.classList.add('punched'); } if (isPunchingIn(i)) { cell.classList.add('punching'); } if (hasPunchedOut(i)) { cell.classList.add('punched-out'); } if (isPunchingOut(i)) { cell.classList.add('punching-out'); } if (i === 7) { row = tbody.insertRow(); // 换行 } } function getDaysInMonth(year, month) { return new Date(year, month, 0).getDate(); } function hasPunchedIn(date) { // TODO: 判断该日期是否已经打卡 return false; } function isPunchingIn(date) { // TODO: 判断用户是否正在打卡 return false; } function hasPunchedOut(date) { // TODO: 判断该日期是否已经下班打卡 return false; } function isPunchingOut(date) { // TODO: 判断用户是否正在下班打卡 return false; } ``` 3. 最后,使用 CSS 样式来定义单元格的外观,以突出显示用户的打卡记录。 ```css td.today { background-color: #f0f0f0; } td.punched { background-color: green; color: white; } td.punching { background-color: yellow; } td.punched-out { background-color: red; color: white; } td.punching-out { background-color: orange; } ``` 在实际使用中,需要根据实际情况修改 JavaScript 代码中的 TODO 部分,以实现具体的打卡功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值