Android-模仿钉钉日历控件开发
写在前面的话
对于一个开发者而言,大量的项目是提升技能的最好办法。在模仿别人的东西之前想设想一下,如果自己来开发的话应该如何设计实现
需求出现的场景
最近接了一个保险的项目,项目里面有个考勤的页面落到了我的手上,产品的模仿能力超强,直接按照钉钉整了一个一毛一样的,而且还多了个日考勤记录的东东。
我的解决方案
面对这一地鸡毛,业务不清晰的需求时。我开始整理和梳理需求,讲钉钉上的考勤页面来回点了点,发现了很多细节的地方,果然细节决定成败!在梳理了钉钉考勤页面的细节和业务流程走向之后,我开始了模仿之路
核心代码
逻辑部分
import static com.kc.util.TimeUtils.DATE_FORMAT_LONG_SIMPLE;
import static com.kc.util.TimeUtils.DATE_FORMAT_MONTH;
import static com.kc.util.TimeUtils.DATE_FORMAT_WEEK;
/**
* Copyright (C), 2016-2019
* FileName: CalendarView
* Author:crobot
* Date: 2019/10/11 13:57
* Description: ${DESCRIPTION}
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
public class CalendarView extends LinearLayout implements View.OnClickListener {
ImageView ivAdd;
ImageView ivSub;
TextView tvTime;
private View rootView;
SegmentedControl segmentedControl;
Calendar calendar = Calendar.getInstance();
private int currentType = Calendar.DATE;
private String startTimeStr;
private String entTimeStr;
private CallBack callBack;
public CalendarView(Context context) {
this(context, null);
}
public CalendarView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CalendarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(final Context context) {
rootView = LayoutInflater.from(context).inflate(R.layout.layout_calendar, this, true);
ivAdd = rootView.findViewById(R.id.iv_add);
ivSub = rootView.findViewById(R.id.iv_sub);
tvTime = rootView.findViewById(R.id.tv_time);
segmentedControl = rootView.findViewById(R.id.sg_control);
ivAdd.setOnClickListener(this);
ivSub.setOnClickListener(this);
segmentedControl.setOnItemSelectedListener(new SegmentedControl.OnItemSelectedListener() {
@Override
public void onItemSelected(Segmented segmented, int index) {
switch (index) {
case 0:
currentType = Calendar.DATE;
break;
case 1:
currentType = Calendar.WEEK_OF_MONTH;
break;
case 2:
currentType = Calendar.MONTH;
break;
}
update();
}
});
update();
}
@Override
public void onClick(View view) {
String timeStr;
switch (view.getId()) {
case R.id.iv_add:
changeDate(true);
break;
case R.id.iv_sub:
changeDate(false);
break;
}
}
/**
* 修改时间
*
* @param b true 加 false 减
*/
private void changeDate(boolean b) {
if (b) {
calendar.add(currentType, 1);
if (!calendar.before(Calendar.getInstance())) {
ToastUtil.showToast("不能查询未开始的考勤");
calendar.add(currentType, -1);
return;
}
} else {
calendar.add(currentType, -1