这篇文章主要介绍了机器人自定义日期段选择控件功能,开始时间-结束时间。本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
开发中碰到个需求,需要在一个空间中选择完成开始和结束时间。实现的过程走的是程序员开发的老路子,找到轮子后自己改吧改吧就成了。
当时做的时候有几个需求:1.当天为最大的结束日期,2.最大选择范围一年,3.开始时间和结束时间可以为同一天。如有其他需求实现,可以参考代码改进一下。先上效果图:
视频点击后的虚影是屏幕录制的原因。实现步骤:(如有缺失什么资源,请告知。开始时间和结束时间显示自己布局内添加就可以)
1.自定义控件属性
可声明样式的名称='我的日历'
属性名称='日期格式'格式='字符串'/属性
属性名称='标题大小'格式='尺寸'/属性
属性名称='标题颜色'格式=' color '/属性
属性名称='goIcon '格式=' reference '/属性
属性名称='preIcon '格式=' reference '/属性
attr name=' dayInMonthColor ' format=' color '/attr
attr name=' dayOutMonthcolor ' format=' color '/attr
attr name=' todayColor ' format=' color '/attr
attr name=' todayEmptycircleColor ' format=' color '/attr
attr name=' todayFillcircleColor ' format=' color '/attr
属性名称='日历背景'格式=' color | reference '/属性
/declare-styleable
2.自定义控件代码
/**
* @描述:可以选择时间范围的日历控件
* @作者孟西
* @埃米尔mxy_2012_1@163.com
* @日期2019/1/8
*/
公共类日历视图扩展了线性布局实现视图OnClickListener{
私有文本视图标题;
私有回收视图回收视图
私有相对布局layout _ calendar _ gonext
私有相对布局layout _ calendar _ goup
private LinearLayoutManager LinearLayoutManager;
私有日历curDate=日历。getinstance();
//从服务器获取的日期
私人日期日期服务器
//外层主回收视图的适配器
私有MainRvAdapter主适配器
private ListCalendarCell months=new ArrayList();
私有上下文语境;
//相关属性
私有int titleColor
私有int titleSize
private int enableSelectColor
private int disableSeletColor
私有int todayColor
private int todayEmptyColor
private int todayFillColor
/** 初始日期为当前日期前一年*/
私有字符串时间;
很久以前是私人的;
私人长期现在
private ListString titles=new ArrayList();
//点击的开始时间与结束时间
私人约会sDateTime
私人约会eDateTime
private boolean正在选择=true
private HashMapInteger,SubRvAdapter all adapters=new HashMap();
公共日历视图(上下文上下文){
这(上下文,空);
}
公共日历视图(上下文上下文,属性集属性){
this(context,attrs,0);
}
private int maxSelect=13
公共日历视图(上下文Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);
类型化数组ta=上下文。观察styledattributes(attrs,r . styleable。我的日历);
标题色=ta。getcolor(r . styleable。我的日历_标题颜色,颜色.白色);
titleSize=(int)ta。获取尺寸(r . style able。我的日历_ titleSize,15);
enableSelectColor=ta。getcolor(r . style able。my calendar _ dayInMonthColor,context.getResources().getColor(r . color。text _ lable));
禁用elet color=ta。getcolor(r . style able。my calendar _ dayOutMonthcolor,context.getResources().getColor(r . color。text _ un enable));
今日色=ta。getcolor(r . style able。我的日历_今天颜色,颜色.蓝色);
todayEmptyColor=ta。getcolor(r . style able。我的日历_今日日历彩色,彩色.青色);
todayFillColor=ta。getcolor(r . style able。我的日历_ todayFillcircleColor,颜色.青色);
ta。recycle();
this.context=上下文
初始化(上下文);
}
//该方法用于设置从服务器获取的时间,如果没有从服务器获取的时间将使用手机本地时间
私有void initTime() {
日历日历=日历。getinstance();//得到日历
日历。settime(新日期());
calendar.add(日历月,-(最大选择-1));
时间=日期效用。格式化数据(日历。gettime(),常量t甲酸盐_ YMD);
时间之前=日期效用。获取数据时间(time);
string now=Date utils。格式化数据(新日期(),常量t甲酸盐_ YMD);
现在时间=日期效用。获取数据时间(现在);
//LogUtils.e('之前日期:' time '==' time before);
//LogUtils.e('当前日期:'现在'=='现在时间);
curDate=DateUtil.strToCalendar(时间,常数t甲酸盐_ YMD);
dateFromServer=date util。str todate(时间,常数t甲酸盐_ YMD);
}
私有空的初始化(上下文上下文){
绑定视图(上下文);
呈现日历();
}
私有void bindView(上下文上下文){
View view=LayoutInflater.from(上下文)。膨胀(r .布局。appoint _ calendar view,这个,false);
title=(TextView)视图。findviewbyid(r . id。日历_标题);
标题。settextcolor(标题颜色);
标题。settextsize(标题大小);
layout _ calendar _ gonext=view。findviewbyid(r . id。layout _ calendar _ gonext);
layout _ calendar _ goup=view。findviewbyid(r . id。布局_日历_组);
layout _ calendar _ gonext。setonclicklistener(this);
布局_日历_分组。setonclicklistener(this);
回收视图=(回收视图)视图。findviewbyid(r . id。日历_ RV);
linearrayoutmanager=new linearrayoutmanager(this。上下文,linearrayoutmanager .横,假);
回收视图。setlayoutmanager(linearrayoutmanager);
pagersnapbhelper snap helper=new pagersnapbhelper();
快照助手。attachtorecyclerview(回收器视图);
添加视图(视图);
}
公共void renderCalendar() {
几个月。clear();
init time();
for(int I=0;i maxSelecti ) {
ArrayList日期单元格=new ArrayList();
如果(我!=0) {
curDate.add(日历。月,1);//后推一个月
}否则{
curDate.add(日历。月,0);//当前月
}
Calendar Calendar=(Calendar)curdate。clone();
//将日历设置到当月第一天
日历. set(日历。月日,1);
//获得当月第一天是星期几,如果是星期一则返回一此时1-1=0证明上个月没有多余天数
前一天=日历。获取(日历.星期几)-1;
//将日历在一号的基础上向前推前几天天。
calendar.add(日历。月日,-前几天);
//最大行数是6*7也就是,1号正好是星期六时的情况
int maxCellcount=6 * 7;
而(细胞。size()maxCellcount){
细胞。添加(日历。gettime());
//日期后移一天
calendar.add(日历。月日,1);
}
months.add(新CalendarCell(i,单元格));
}
for(int I=0;一个月。size();i ) {
//标题格式2018年6月3日
String title=(months.get(i).getCells().得到(20)分.getYear() 1900年)
\t-\t '
months.get(i).getCells().得到(20)分.getMonth()1);
标题。添加(标题);
}
标题。settext(标题。get(max select-1));
//只限定3个月,因此模拟给3个数值即可
主适配器=新的主适配器(r .布局。约会_日历视图_项目,月份);
回收视图。设置适配器(主适配器);
//回收视图的滚动监听
recyclerView。addonscrolllistener(新回收器视图.onscrollistener(){
@覆盖
public void onScrollStateChanged(RecyclerView RecyclerView,int newState) {
标题。settext(标题。get(linearrayoutmanager。findlastvisibleitemposition()));
超级棒。onscrollstatechanged(回收器视图,新状态);
}
});
回收视图。scrolltoposition(最大选择-1);
}
@覆盖
公共void onClick(视图五){
int index=linearrayoutmanager。findlastvisibleitemposition();
LogUtils.e('当前项指数);
switch (v.getId()){
案件编号。layout _ calendar _ go下一步:
if(index maxSelect-1){
recyclerView.scrollToPosition(索引1);
标题。settext(标题。get(索引1));
}
打破;
案例编号。布局_日历_分组:
如果(索引0){
recyclerView.scrollToPosition(索引-1);
标题。settext(标题。get(index-1));
}
打破;
}
}
/**
* 最外层水平回收视图的适配器
*/
私有类MainRvAdapter扩展了BaseQuickAdapterCalendarCell,BaseViewHolder {
public mainr adapter(int layout resid,@ Nullable ListCalendarCell data){
super(layoutResId,data);
}
@覆盖
受保护的void convert(BaseViewHolder helper,final CalendarCell item) {
if(((循环视图)帮助器。获取视图(r . id。appoint _ calendar view _ item _ RV).getLayoutManager()==null) {
//回收视图不能都使用同一个布局管理器
GridLayoutManager manager=new GridLayoutManager(m context,7);
//回收视图嵌套高度不固定(换行_内容)时必须setAutoMeasureEnabled(真),否则测量时控件高度为0
经理。setautomeasureenabled(true);
((回收视图)助手。获取视图(r . id。appoint _ calendar view _ item _ RV).setLayoutManager(经理);
}
SubRvAdapter subRvAdapter=null
如果(所有适配器。获取(帮助者。get position())==null){
子适配器=新的子适配器(r .布局。日历_文本_日,项目。get cells());
所有适配器。放(助手。get position()、subRvAdapter);
((回收视图)助手。获取视图(r . id。appoint _ calendar view _ item _ RV).setAdapter(subRvAdapter);
}否则{
subRvAdapter=所有适配器。获取(帮助者。get position());
((回收视图)助手。获取视图(r . id。appoint _ calendar view _ item _ RV).setAdapter(subRvAdapter);
}
//项目点击事件响应
子适配器。setonitemclicklistener(new OnItemClickListener(){
@覆盖
公共void onItemClick(基本快速适配器适配器,视图视图,int位置){
Date date=item.getCells().获取(位置);
如果(日期。gettime()=日期之前的时间。gettime()=现在时间){
如果(正在选择时间){
//正在选择开始时间
selectSDate(item.getCells().获取(位置));
}否则{
//正在选择结束时间
selectEDate(item.getCells().获取(位置));
}
}
//更新所有的适配器,比如今天6月,需要更新6、7、8三个月份不同适配器
迭代器iterator=allAdapters.entrySet().迭代器();
while (iterator.hasNext()) {
地图. Entry entry=(Map .entry)迭代器。next();
((SubRvAdapter) entry.getValue()).notifyDataSetChanged();
}
}
});
}
}
公共无效选择日期(日期日期){
if (sDateTime!=null eDateTime!=null) {
sDateTime=日期;
notifyDateSelectChanged();
}否则{
sDateTime=日期;
notifyDateSelectChanged();
}
eDateTime=null
isSelectingSTime=false
/** 当前没有选择结束时间*/
if(this.calendaSelListener!=null){
calendasellistener。选择状态(假);
}
}
公共无效选择日期(日期日期){
if (sDateTime!=null) {
如果(日期。gettime()=sdatetime。gettime()){
eDateTime=日期
isSelectingSTime=true
notifyDateSelectChanged();
}否则{
eDateTime=sDateTime
sDateTime=日期;
isSelectingSTime=true
notifyDateSelectChanged();
}
/** 选择完成*/
if(this.calendaSelListener!=null){
calendasellistener。选择状态(真);
}
}
}
/**
* 通知开始时间跟结束时间均改变
*/
public void notifyDateSelectChanged(){
if (mETimeSelectListener!=null eDateTime!=null) {
metimeselectlistener。一次选择(eDateTime);
}
if (mSTimeSelectListener!=null sDateTime!=null) {
mstimeselectlistener。on time select(sDateTime);
}
}
私有类子适配器扩展BaseQuickAdapterDate,BaseViewHolder {
公共sub适配器(int layout resid,@Nullable ListDate data) {
super(layoutResId,data);
}
@RequiresApi(api=Build .版本代码。果冻豆)
@覆盖
受保护的void convert(base view holder helper,Date date) {
帮手。setis可回收(false);//不让回收视图进行复用,复用会出问题
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).setEmptyColor(todayEmptyColor);
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).setFillColor(todayFillColor);
int day=date。getdate();
//设置文本
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).setText(字符串。(天)的值;
//设置颜色
如果(日期。gettime()=日期之前的时间。gettime()=现在时间){
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).settext color(enableSelectColor);
}否则{
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).settext颜色(禁用elet颜色);
}
//更改选中文字颜色
if(sDateTime!=null eDateTime!=null){
如果(日期。gettime()sdatetime。gettime()日期。gettime()edatetime。gettime()){
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).被选中(真);
帮手。获取视图(r . id。日历日.setBackgroundColor(获取资源().getColor(r . color。date _ duration _ BG);
}
}
/****************************/
if (eDateTime!=空日期。gettime()==edatetime。gettime()){
//结束时间
if(edatetime。等于(sDateTime)){
((CalendarDayRelativeLayout)助手。获取视图(r . id。日历日.isSameDay();
}否则{
((CalendarDayRelativeLayout)助手。获取视图(r . id。日历日.ise时间(真);
}
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).ise时间(真);
}
if (sDateTime!=空日期。gettime()==sdatetime。gettime()){
//开始时间
if (eDateTime!=null) {
if(edatetime。等于(sDateTime)){
((CalendarDayRelativeLayout)助手。获取视图(r . id。日历日.isSameDay();
}否则{
((CalendarDayRelativeLayout)助手。获取视图(r . id。日历日.ISS时间(真);
}
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).ISS时间(真);
}否则{
((CalendarDayRelativeLayout)助手。获取视图(r . id。日历日.isDurationSun(true);
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).ISS时间(真);
}
}
/*****************************************/
if(date.getTime()==timeNow){
((CalendarDayTextView)助手。获取视图(r . id。calendar _ day _ TV).setToday(true);
}
}
}
私有类日历单元格{
私有(同Internationalorganizations)国际组织位置;
ArrayListDate单元格;
public CalendarCell(int position,ArrayListDate单元格){
this.position=位置;
this.cells=细胞;
}
public int getPosition() {
返回位置;
}
公共无效设置位置(中间位置){
this.position=位置;
}
public ArrayListDate getCells() {
返回单元格;
}
公共空集单元格(数组列表日期单元格){
this.cells=细胞;
}
}
//开始时间的选择监听
公共界面日历时间列表器{
void onSTimeSelect(日期日期);
}
私人日历timesellistener mSTimeSelectListener;
public void setSTimeSelListener(calendarstatimesellistener Li){
mSTimeSelectListener=li
}
//结束时间的监听事件
公共接口CalendatEtimSelListener {
void onETimeSelect(日期日期);
}
私有CalendaSelListener CalendaSelListener;
/**选择日期完整性*/
公共接口CalendaSelListener{
void selectStatus(布尔型isOk);
}
public void setCalendaSelListener(CalendaSelListener CalendaSelListener){
这个。calendaSelListener=calendaSelListener;
}
私有CalendatEtimSelListener mETimeSelectListener;
public void setETimeSelListener(CalendatEtimSelListener Li){
mETimeSelectListener=李;
}
}
3.自定义视角用到的布局appoint_calendarview.xml,对应日历控件如下面图片的部分。
?可扩展标记语言版本='1.0 '编码='utf-8 '?
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:layout_marginTop='15dp '
安卓:方向='垂直'
相对布局
Android:layout _ width=' match _ parent '
android:layout_height='20dp '
安卓:重力='居中_垂直'
安卓:方向='水平'
文本视图
android:id='@ id/calendar_title '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
Android:layout _ centerInParent=' true '
android:text='2018年'
Android:text color=' @ color/text _ lable '
android:textSize='15dp'/
相对布局
Android:id=' @ id/layout _ calendar _ gonext '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' match _ parent '
Android:layout _ alignParentRight=' true '
android:paddingLeft='15dp '
android:paddingRight='15dp '
图像视图
android:layout_width='10dp '
android:layout_height='10dp '
Android:layout _ center vertical=' true '
Android:src=' @ MIP map/icon _ arrow _ right '/
/RelativeLayout
相对布局
Android:id=' @ id/layout _ calendar _ goup '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' match _ parent '
android:paddingLeft='15dp '
android:paddingRight='15dp '
图像视图
android:layout_width='10dp '
android:layout_height='10dp '
Android:layout _ center vertical=' true '
Android:src=' @ MIP map/icon _ back _ black '/
/RelativeLayout
/RelativeLayout
线性布局
Android:id=' @ id/calendar _ week _ header '
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
android:layout_marginTop='15dp '
安卓:重力='居中_垂直'
安卓:方向='水平'
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/sun '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/mon '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/tue '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/wed '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/thu '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/fri '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
文本视图
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
android:layout_weight='1 '
android:text='@string/sat '
android:textAlignment='center '
android:textColor='#555 '
android:textSize='13dp' /
/线性布局
安卓。支持。V7。小部件。回收视图
android:id='@ id/calendar_rv '
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
android:layout_marginTop='10dp '
android:overScrollMode='never '
/
/线性布局
定义控件选择后的背景部分:CalendarDayRelativeLayout.java
导入安卓。内容。语境;
导入安卓。图形。颜色;
导入安卓。OS。建造;
导入安卓。支持。注释。需要API
导入安卓。util。attributeset
导入安卓。小部件。相对布局;
公共类CalendarDayRelativeLayout扩展相对布局{
公共CalendarDayRelativeLayout(上下文上下文){
这(上下文,空);
}
公共日历DayRelativeLayout(上下文上下文,属性集属性){
super(上下文,attrs);
}
@RequiresApi(api=Build .版本代码。果冻豆)
public void是durations at(boolean isSaturday){
这个。设置背景(获取资源().getDrawable(r . drawable。委任_日历_星期六_ BG));
}
@RequiresApi(api=Build .版本代码。果冻豆)
public void is durations un(boolean isSunday){
这个。设置背景(获取资源().getDrawable(r . drawable。委任_日历_太阳_ BG));
}
@RequiresApi(api=Build .版本代码。果冻豆)
公共void ise时间(布尔etime){
//这个。setbackgroundresource(get resources().getDrawable(r . drawable。));
这个。设置背景(获取资源().getDrawable(r . drawable。委任_日历_星期六_ BG));
}
@RequiresApi(api=Build .版本代码。果冻豆)
public void isSTime(布尔时间){
//这个。设置背景(获取资源().getDrawable(r . MIP映射。任命_日历_开始_ BG));
这个。设置背景(获取资源().getDrawable(r . drawable。委任_日历_太阳_ BG));
}
/**
* 同一天
* */
@RequiresApi(api=Build .版本代码。果冻豆)
public void isSameDay(){
这个。设置背景(获取资源().getDrawable(r . drawable。委任_日历_相同_ BG));
}
}
自定义控件内日期的CalendarDayTextView.java
导入安卓。内容。语境;
导入安卓。图形。画布;
导入安卓。图形。颜色;
导入安卓。图形。油漆;
导入安卓。图形。字体;
导入安卓。util。attributeset
/**
* @描述:日历内日期
* @作者孟西
* @日期2019/1/8
*/
公共类CalendarDayTextView扩展了安卓。支持。V7。小部件。appcompattextview {
公共布尔值isToday
私有布尔isSTime
私有布尔isETime
私有上下文语境;
public void setEmptyColor(int emptyColor){
这个。空色=空色;
}
public void setFillColor(int fill color){
这个。填充颜色=填充颜色;
}
private int空color=color。分析颜色(# 00ff 00);
一等兵
nt fillColor = Color.parseColor("#00ff00"); private Paint mPaintSTime; private Paint mPaintETime; public CalendarDayTextView(Context context) { super(context); initview(context); } public CalendarDayTextView(Context context, AttributeSet attrs) { super(context, attrs); initview(context); } private void initview(Context context) { this.context=context; // mPaintSTime = new Paint(Paint.ANTI_ALIAS_FLAG); // mPaintSTime.setStyle(Paint.Style.FILL); // mPaintSTime.setColor(context.getResources().getColor(R.color.date_time_bg)); // mPaintSTime.setStrokeWidth(2); // // mPaintETime = new Paint(Paint.ANTI_ALIAS_FLAG); // mPaintETime.setStyle(Paint.Style.FILL); // mPaintETime.setColor(context.getResources().getColor(R.color.date_time_bg)); // mPaintETime.setStrokeWidth(2); } @Override protected void onDraw(Canvas canvas) { //根据当前逻辑开始时间必须先绘制结束时间 // if (isETime) { // canvas.save(); // //移动到当前控件的中心,以中心为圆点绘制实心圆 // canvas.translate(getWidth() / 2, getHeight() / 2); // canvas.drawCircle(0, 0, getWidth() / 2 , mPaintETime); // canvas.restore(); // //此处必须将圆移动回开始位置,否则文本显示会受到影响 // canvas.translate(0, 0); // } // // if (isSTime) { // canvas.save(); // //移动到当前控件的中心,以中心为圆点绘制实心圆 // canvas.translate(getWidth() / 2, getHeight() / 2); // canvas.drawCircle(0, 0, getWidth() / 2 , mPaintSTime); // canvas.restore(); // //此处必须将圆移动回开始位置,否则文本显示会受到影响 // canvas.translate(0, 0); // } super.onDraw(canvas); } public void setToday(boolean today) { isToday = today; this.setTextColor(context.getResources().getColor(R.color.text_main_tab_select)); } public void isETime(boolean etime) { isETime = etime; // this.setTextColor(context.getResources().getColor(R.color.date_time_tv)); // this.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); isSelected(true); } public void isSTime(boolean stime) { isSTime = stime; isSelected(true); // this.setTextColor(context.getResources().getColor(R.color.date_time_tv)); // this.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); } public void isSelected(boolean isSelcted){ if(isSelcted){ this.setTextColor(context.getResources().getColor(R.color.date_time_tv)); this.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); }else { this.setTextColor(context.getResources().getColor(R.color.text_lable)); } } }appoint_calendarview.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/appoint_calendarview_item_rv" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView>calendar_text_day.xml
<?xml version="1.0" encoding="utf-8"?> <com.包名.CalendarDayRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="44dp" android:gravity="center" android:id="@+id/calendar_day_rl" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" > <com..包名.CalendarDayTextView android:id="@+id/calendar_day_tv" android:layout_width="44dp" android:layout_height="44dp" android:layout_centerInParent="true" android:gravity="center" android:textColor="@color/white" android:text="31" android:includeFontPadding="false" android:textSize="13dp"/> </com..包名.CalendarDayRelativeLayout>DateUtil.java
import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateUtil { //Calendar 转化 String public static String calendarToStr(Calendar calendar,String format) { // Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(calendar.getTime()); } //String 转化Calendar public static Calendar strToCalendar(String str,String format) { // String str = "2012-5-27"; SimpleDateFormat sdf = new SimpleDateFormat(format); Date date = null; Calendar calendar = null; try { date = sdf.parse(str); calendar = Calendar.getInstance(); calendar.setTime(date); } catch (ParseException e) { e.printStackTrace(); } return calendar; } // Date 转化String public static String dateTostr(Date date,String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); // String dateStr = sdf.format(new Date()); String dateStr = sdf.format(date); return dateStr; } // String 转化Date public static Date strToDate(String str,String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); Date date = null; try { date = sdf.parse(str); } catch (ParseException e) { e.printStackTrace(); } return date; } //Date 转化Calendar public static Calendar dateToCalendar(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar; } //Calendar转化Date public static Date calendarToDate(Calendar calendar) { return calendar.getTime(); } // String 转成 Timestamp public static Timestamp strToTimeStamp(String str) { // Timestamp ts = Timestamp.valueOf("2012-1-14 08:11:00"); return Timestamp.valueOf(str); } //Date 转 TimeStamp public static Timestamp dateToTimeStamp(Date date,String format) { SimpleDateFormat df = new SimpleDateFormat(format); String time = df.format(new Date()); Timestamp ts = Timestamp.valueOf(time); return ts; } }4.资源文件 /drawableappoint_calendar_sat_bg.xml //开始时间
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:topRightRadius="44dp" android:bottomRightRadius="44dp"/> <size android:height="44dp"/> <solid android:color="#41D2C4"/> </shape>appoint_calendar_sun_bg.xml //结束时间
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:bottomLeftRadius="44dp" android:topLeftRadius="44dp" /> <size android:height="44dp" /> <solid android:color="#41D2C4" /> </shape>appoint_calendar_same_bg.xml //开始时间和结束时间是同一天
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/date_duration_bg" /> <corners android:radius="60dp" /> </shape>/value?
<string name="sun">日</string> <string name="mon">一</string> <string name="tue">二</string> <string name="wed">三</string> <string name="thu">四</string> <string name="fri">五</string> <string name="sat">六</string> <color name="date_duration_bg">#41D2C4</color>5.在activity中使用?activity_selectdate.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@color/white" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp"> <FrameLayout android:id="@+id/layout_line" android:layout_width="10dp" android:layout_height="1dp" android:layout_centerInParent="true" android:background="#35C1B5" /> <TextView android:id="@+id/tv_startime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/layout_line" android:layout_marginRight="22.5dp" android:textColor="#35C1B5" android:textSize="14dp" android:text="@string/starTime" /> <TextView android:id="@+id/tv_endtime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/layout_line" android:layout_marginLeft="22.5dp" android:textColor="#35C1B5" android:textSize="14dp" android:text="@string/endTime" /> </RelativeLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_marginTop="10dp" android:background="@color/bg_line" /> <com.包名.CalendarView android:id="@+id/calendarview" android:layout_width="match_parent" android:layout_height="wrap_content" app:titleColor = "@color/text_lable" /> </LinearLayout>SelectTimeActivity.java
public class SelectTimeActivity extends BaseActivity { @BindView(R.id.tv_title) TextView tvTitle; @BindView(R.id.iv_title_back) ImageView ivTitleBack; @BindView(R.id.tv_title_left) TextView tvTitleLeft; @BindView(R.id.layout_title_left) RelativeLayout layoutTitleLeft; @BindView(R.id.tv_title_right) TextView tvTitleRight; @BindView(R.id.layout_title_right) RelativeLayout layoutTitleRight; @BindView(R.id.layout_line) FrameLayout layoutLine; @BindView(R.id.tv_startime) TextView tvStartime; @BindView(R.id.tv_endtime) TextView tvEndtime; @BindView(R.id.calendarview) CalendarView calendarview; private String starTime; private String endTime; private boolean isSelecgOk = false; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_selectdate); ButterKnife.bind(this); setStatusBar(true); initView(); } private void initView() { tvTitle.setText(getString(R.string.selectTime)); ivTitleBack.setVisibility(View.GONE); tvTitleLeft.setText(getString(R.string.cancel)); tvTitleRight.setText(getString(R.string.confirm)); calendarview.setETimeSelListener(new CalendarView.CalendatEtimSelListener() { @Override public void onETimeSelect(Date date) { if (date != null) { endTime = DateUtils.formatData(date, Constant.TFORMATE_YMD); tvEndtime.setText(endTime); }else { endTime = null; } } }); calendarview.setSTimeSelListener(new CalendarView.CalendarSTimeSelListener() { @Override public void onSTimeSelect(Date date) { if (date != null) { starTime = DateUtils.formatData(date, Constant.TFORMATE_YMD); tvStartime.setText(starTime); }else { starTime = null; } } }); calendarview.setCalendaSelListener(new CalendarView.CalendaSelListener() { @Override public void selectStatus(boolean isOk) { isSelecgOk = isOk; } }); } @OnClick({R.id.tv_title_left, R.id.tv_title_right}) public void onClick(View view) { switch (view.getId()) { case R.id.tv_title_left: finish(); break; case R.id.tv_title_right: if(TextUtils.isEmpty(starTime)){ ToastUtils.showToast(getString(R.string.history_alert1)); return; } if(TextUtils.isEmpty(endTime) || !isSelecgOk){ ToastUtils.showToast(getResources().getString(R.string.history_alert)); return; } Intent intent = new Intent(); intent.putExtra("starTime",starTime); intent.putExtra("endTime",endTime); setResult(RESULT_OK,intent); finish(); break; } } }RecyclerAdapter引用
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'到此这篇关于Android 自定义日期段选择控件,开始时间-结束时间。的文章就介绍到这了,更多相关Android 自定义日期段选择控件,开始时间-结束时间。内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。