Android Kotlin Java 自定义日历控件 CalendarView ,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期

这篇具有很好参考价值的文章主要介绍了Android Kotlin Java 自定义日历控件 CalendarView ,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GitHub 源码地下载

https://github.com/hdev0225/CalendarView

CalendarView 日历控件

CalendarView 使用kotlin语言开发,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期

设置不可选择日期,设置只可选择某些日期

运行环境

AS 版本: Android Studio Dolphin | 2021.3.1

Android Gradle Plugin Version: 7.3.0

Gradle Version: 7.5

示例

Demo

安装

1、添加JitPack仓库到根路径下的build.gradle

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

2、添加依赖到模块中的build.gradle

dependencies {
    implementation 'com.github.hdev0225:CalendarView:v1.0.6'
}

日历功能简介

简单应用
单选日历 SingleCalendarView
多选日历 MultiCalendarView
按星期选择日历 WeekCalendarView
日期范围选择 RangeCalendarView
设置样式
设置不可选择日期列表
设置只可选择某些日期列表

简单示例

默认情况下:开始日期为1970-1-1,结束日期为手机时间,并选中当前时间

<com.hdev.calendar.view.SingleCalendarView
    android:id="@+id/calendar_view"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:layout_margin="15dp"
    android:background="@drawable/bg" />

单选日历

安卓自定义日历控件,android,android,kotlin

<com.hdev.calendar.view.SingleCalendarView
    android:id="@+id/calendar_view"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:layout_margin="15dp"
    android:background="@drawable/bg" />
val calendarView: SingleCalendarView = findViewById(R.id.calendar_view)
// 事件监听        
calendarView.setOnSingleDateSelectedListener {
_, dateInfo ->
Toast.makeText(this@SingleActivity, dateInfo.toString(), Toast.LENGTH_LONG).show()}
// 开始日期        
var startDate = DateInfo(2023, 1, 15)
// 结束日期        
val endDate = DateInfo(2023, 4, 15)
// 选中2023-1-1
val selectedDate = DateInfo(2023, 1, 1)
// 初始化,设置日期范围
calendarView.setDateRange(
    startDate.timeInMillis(),
    endDate.timeInMillis(),
    selectedDate.timeInMillis()
)

多选日历

安卓自定义日历控件,android,android,kotlin

<com.hdev.calendar.view.MultiCalendarView
    android:id="@+id/calendar_view"
    android:layout_width="wrap_content"
    android:layout_height="400dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="@drawable/bg" />

val dateList = mutableListOf<DateInfo>()
dateList.add(DateInfo(2023, 5, 3))
dateList.add(DateInfo(2023, 5, 8))
dateList.add(DateInfo(2023, 5, 5))

val calendarView: MultiCalendarView = findViewById(R.id.calendar_view)
calendarView.setOnMultiDateSelectedListener {
_, clickedDate, dateList ->
}
// 设置选中日期列表
calendarView.selectedDateList = dateList

按星期选择

安卓自定义日历控件,android,android,kotlin

<com.hdev.calendar.view.WeekCalendarView
    android:id="@+id/calendar_view"
    android:layout_width="match_parent"
    android:layout_height="420dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" />
// 开始日期
val startDate = DateInfo(2021, 12, 30)
// 结束日期        
val endDate = DateInfo(2023, 4, 15)
// 设置某一天,该星期会选中
val selectedDate = DateInfo(2022, 1, 1)

val calendarView: WeekCalendarView = findViewById(R.id.calendar_view)
// 事件监听        
calendarView.setOnDateRangeSelectedListener {
_, selecteDate, startDate, endDate ->
Toast.makeText(this@WeekActivity, "start: $startDate, end:$endDate", Toast.LENGTH_LONG).show()
}

日期范围选择

安卓自定义日历控件,android,android,kotlin

 <com.hdev.calendar.view.RangeCalendarView
       android:id="@+id/calendar_view"
       android:layout_width="match_parent"
       android:layout_height="400dp"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:background="#ffffff"
       app:header_view="com.hdev.calendar.view.DefaultRangeHeaderView"
       app:selected_bg_color="#0078D7"
       app:selected_end_bg_color="#ff0000"
       app:selected_end_day_color="#ffffff"
       app:selected_range_bg_color="#88ff0000"
       app:selected_range_day_color="#ffffff"
       app:selected_start_bg_color="#ff0000"
       app:selected_start_day_color="#ffffff" />
val calendarView: RangeCalendarView = findViewById(R.id.calendar_view)
// 设置日期范围        
calendarView.setSelectedDateRange(DateInfo(2023, 2, 21), DateInfo(2023, 5, 13))
// 事件监听
calendarView.setOnDateRangeSelectedListener {
_, // 日历控件
_, // 选中的日期
startDate: DateInfo, // 开始日期
endDate: DateInfo -> // 结束日期
Toast.makeText(this@RangeActivity, "${startDate.format()}---${endDate.format()}", Toast.LENGTH_SHORT).show()
}

设置日历样式

安卓自定义日历控件,android,android,kotlin

<com.hdev.calendar.view.SingleCalendarView
    android:id="@+id/calendar_view"
    android:layout_width="350dp"
    android:layout_height="335dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="@drawable/bg"
    app:day_font_size="16sp"
    app:default_color="#000000"
    app:default_dim_color="#AAAAAA"
    app:header_view="com.calendar.app.view.CustomHeaderView"
    app:selected_bg_color="#0078D7"
    app:selected_day_color="#EFEFEF"
    app:week_title_color="#ff0000"
    app:week_title_font_size="12sp"
    app:week_title_label="M、T、W、T、F、S、S"
    app:weekend_color="#F96A31" />
通用属性

header_view:头部,包名+类型,需要继承BaseHeaderView类,自定义头部

day_font_size:日期字体大小,eg: 16sp

week_title_color: 星期标题颜色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

week_title_font_size:星期标题字体大小, eg: 12sp;

week_title_label:星期标题,以顿号分割,如:一、二、三、四、五、六、日。起始星期为星期一;

注!!!:设置了first_day_of_week,需要同时设置week_title_label

first_day_of_week:一周的第一天,1表示星期一,2表示星期二,7表示星期天;

default_color:默认文字颜色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

default_dim_color:默认文字灰色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

weekend_color:周未字体颜色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

selected_bg_color:选中背景色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

selected_day_color:选中日子颜色,类型:颜色码或者颜色引用, eg:#ffff00或者R.color.red;

selected_day_dim_color:范围选择或者按星期选择的日历时,该日期不能选择,但在范围或者星期之间, eg:#ffff00或者R.color.red;

日期范围属性

selected_range_bg_color:选中区间背景色,开始与结束之间的日期(不包括开始和结束日期), eg:#ffff00或者R.color.red;

selected_range_day_color:选中区间字体颜色,开始与结束之间的日期(不包括开始和结束日期), eg:#ffff00或者R.color.red;

selected_start_bg_color:开始日期背景色, eg:#ffff00或者R.color.red;

selected_start_day_color:开始日期字体颜色, eg:#ffff00或者R.color.red;

selected_end_bg_color:结束日期背景色, eg:#ffff00或者R.color.red;

selected_end_day_color:结束日期字体颜色, eg:#ffff00或者R.color.red;

设置不可选择日期

val dateList = mutableListOf<DateInfo>()
dateList.add(DateInfo(2023, 4, 8))
dateList.add(DateInfo(2023, 4, 11))
dateList.add(DateInfo(2023, 3, 31))
val calendarView: WeekCalendarView = findViewById(R.id.calendar_view)
// setup un-clickable date
calendarView.unClickableDateList = dateList

设置只可选择某些日期

val dateList = mutableListOf<DateInfo>()
dateList.add(DateInfo(2023, 4, 8))
dateList.add(DateInfo(2023, 4, 11))
dateList.add(DateInfo(2023, 3, 31))
val calendarView: WeekCalendarView = findViewById(R.id.calendar_view)
calendarView.clickableDateList = dateList

CalendarView方法说明

通用方法

unClickableDateList 设置不可点击的日期列表

clickableDateList 设置只能点击的日期列表

setDateRange 设置日期范围,参数:开始日期,结束日期,当前选中的日期

单先日历

setSelectedDate 设置选中某一天,如:点击按钮后,跳转到某一个日期

多选日历

selectedDateList 设置选中的日期列表/获取选中的日期列表

事件监听
/**
 * 单选接口回调
 */
OnSingleDateSelectedListener(
     view: SingleCalendarView, // 日历控件
     selectedDate: DateInfo // 选中的日期
)

/**
 * 按星期选,区域选择接口回调
 */
 OnDateRangeSelectedListener(
     view: BaseCalendarView, // 日历控件
     selectedDate: DateInfo, // 选中的日期
     startDate: DateInfo, // 开始日期
     endDate: DateInfo // 结束日期
)

/**
 * 多选
 */
OnMultiDateSelectedListener(
    view: MultiCalendarView, // 日历控件
    clickedDate: DateInfo, // 当前当点的日期,选中或者取消选中
    dateList: List<DateInfo>, // 日期列表
) 

DateInfo类说明

提供将dateInfo转calendar

将calendar转成dateInfo

将dateInfo转毫秒

BaseHeaderView说明

自定义头部,需要继承BaseHeaderView,更新标题,显示或者隐藏上下面,然后在xml布局文件中设置header_view,如下

app:header_view="com.calendar.app.view.CustomHeaderView"
/**
 * 获取布局id,如:R.layout.default_header_view
 */
protected abstract fun getLayoutId(): Int

/**
 * 更新标题
 */
open fun updateTitle(year: Int, month: Int) {}

/**
 * 处理上、下按钮
 * @param hasPrev 是否有上一页
 * @param hasNext 是否有下一页
 */
open fun handlePrevNext(hasPrev: Boolean, hasNext: Boolean) {}

IDateRange 接口说明

日期范围选择RangeCalendarView,如果自定义headerView实现该接口,可更新headerView日期范围,可参考DefaultRangeHeaderView类文章来源地址https://www.toymoban.com/news/detail-705930.html

class DefaultRangeHeaderView(
        context: Context
) : DefaultHeaderView(context), IDateRange {

	private lateinit var dateRangeLabel: TextView

	override fun dateRange(startDate: DateInfo?, endDate: DateInfo?) {
        if (startDate == null && endDate == null) {
        	dateRangeLabel.text = ""
        } else if (startDate != null && endDate != null) {
        	dateRangeLabel.text = "${startDate.format()} -- ${endDate.format()}"
        } else if (startDate != null) {
        	dateRangeLabel.text = startDate.format()
        }
    }

    override fun getLayoutId(): Int {
        return R.layout.default_range_header_view
    }

    override fun init() {
		super.init()
        dateRangeLabel = findViewById(R.id.date_range_label)
   }
}

到了这里,关于Android Kotlin Java 自定义日历控件 CalendarView ,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android GitHub开源库CalendarView的使用

    学习并记录一下,使用GitHub上面的日历控件开源库CalendarView,地址:https://github.com/huanghaibin-dev/CalendarView 实现效果如下: 添加Gradle依赖 实现MultiMonthView,可多选 比如我这里的四个画笔分别对应的含义: 布局代码使用示例 实现点击()左右箭头实现左右翻页功能 可分别调用

    2024年04月25日
    浏览(37)
  • android 自定义车牌键盘(kotlin)

    平时停车缴费都要填车牌号码,就想着自己能不能也做个车牌键盘demo。 自定义车牌键盘能满足(普通车牌,新能源,警车,军车,领事馆车,教练车以及特种车辆等车牌) 1、车牌前两位默认是:粤A 2、第一个控件,默认是省份键盘 3、剩下控件,默认是abc键盘 4、当前输入

    2024年02月16日
    浏览(32)
  • 推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

    日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所以,今天给大家推荐一个开源库,它支持阳历、阴历、佛历和道历的日历转换,可以满足我们的所有

    2024年02月06日
    浏览(60)
  • Android:自定义控件

    1.自定义VIEW组件 创建CustomizeView,继承View。重写onDraw方法,通过onDraw方法绘制我们自定义的图像、位图、路径等。 示例: 创建对应layout文件,l_customize1.xml文件 示例: 补充:Canvas对象坐标变换方法 translate(100,100):平移变化; rotate(90):旋转变化; scale():缩放变化; save():保存当前

    2024年02月20日
    浏览(29)
  • Android开发基础——自定义控件

    Android中常用控件和布局的继承结构如下图所示:  从上面可以看出,所有控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,其可以在屏幕上绘制一块矩形区域,并能够响应这块区域的各种事件,因此,用户

    2023年04月10日
    浏览(31)
  • Android开发之自定义控件-组合控件的开发与实现

    最终实现的效果展示图:   类似支付宝微信,底部分隔线对齐标题效果:       完整渲染显示效果(包含三个条目右边不同颜色的文字): 立体效果:  隐藏资产总额条目右边更多箭头  隐藏中国历史条目右边的文字: 隐藏中国历史条目下边的分隔线: 隐藏条目2中国历史左

    2024年02月10日
    浏览(32)
  • 【Android】自定义Spinner控件及其使用

    在 res/values/ 文件夹下新建一个 arrays.xml 文件: activity_main.xml 文件: 2.1 dropdown模式 效果: 2.2 dialog模式 效果: 在 res/drawable/ 文件夹下新建两个文件: (1) shape_for_custom_spinner.xml 文件(用来定义下拉框的样式): (2) selector_for_custom_spinner 文件(用来定义Spinner控件本身的样

    2023年04月16日
    浏览(27)
  • Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。

    Fullcalendar这个插件挺好,就是很多方法感觉官方文档也没怎么说,导致上手难度大,而且有些默认事件真的不太友好...废话不多说,先上效果图! 1.1 基本按钮功能 1.2  事件hover显示   1.3 事件添加、编辑、状态修改    1.4 日历事件搜索     2.1 Fullcalendar日历、el-popover弹窗

    2024年02月08日
    浏览(32)
  • 一个.Net强大的Excel控件,支持WinForm、WPF、Android【强烈推荐】

    推荐一个强大的电子表单控件,使用简单且功能强大。 这是一个开源的表格控制组件,支持Winform、WPF和Android平台,可以方便的加载、修改和导出Excel文件,支持数据格式、大纲、公式计算、图表、脚本执行等、还支持触摸滑动,可以方便地操作表格。 总的来说是一个可以快

    2024年02月07日
    浏览(42)
  • 【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)

    目录 ​​​​​​​ 效果图 简介 注意事项 基础属性 滚动条全部设置 滚动条是否总显示 自定义滚动条滑动背景和滚动条背景 设置滚动条的宽度 设置滚动条距离 其它常规设置 设置滚动速度 布局代码示例 总结 HorizontalScrollView是水平滚动标签。垂直滚动动是 ScrollView标签 H

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包