阅读 2784
Android:这是一个让你心动的日期&时间选择组件

Android:这是一个让你心动的日期&时间选择组件

预览

引入

添加 JitPack repository

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}
复制代码

添加 Gradle依赖

dependencies {
    ...
    implementation 'com.google.android.material:material:1.1.0' //为了防止不必要的依赖冲突,0.0.3开始需要自行依赖google material库
    implementation 'com.github.loperSeven:DateTimePicker:0.3.0'//此处不保证最新版本,最新版需前往文末github查看
}
复制代码

开始使用

内置弹窗CardDatePickerDialog

最简单的使用方式

//kotlin
     CardDatePickerDialog.builder(this)
                .setTitle("SET MAX DATE")
                .setOnChoose {millisecond->
                  
                }.build().show()
//java
 new CardDatePickerDialog.Builder(this)
                .setTitle("SET MAX DATE")
                .setOnChoose("确定", aLong -> {
                    //aLong  = millisecond
                    return null;
                }).build().show();
复制代码

所有可配置属性

  CardDatePickerDialog.builder(context)
                .setTitle("CARD DATE PICKER DIALOG")
                .setDisplayType(displayList)
                .setBackGroundModel(model)
                .showBackNow(true)
                .setPickerLayout(layout)
                .setDefaultTime(defaultDate)
                .setMaxTime(maxDate)
                .setMinTime(minDate)
                .setWrapSelectorWheel(false)
                .setThemeColor(color)
                .showDateLabel(true)
                .showFocusDateInfo(true)
                .setLabelText("年","月","日","时","分")
                .setOnChoose("选择"){millisecond->}
                .setOnCancel("关闭") {}
                .build().show()
复制代码

可配置属性说明

  • 设置标题
fun setTitle(value: String)
复制代码
  • 是否显示回到当前按钮
fun showBackNow(b: Boolean)
复制代码
  • 是否显示选中日期信息
fun showFocusDateInfo(b: Boolean)
复制代码
  • 设置自定义选择器
//自定义选择器Layout注意事详见 【定制 DateTimePicker】
fun setPickerLayout(@NotNull layoutResId: Int)
复制代码
  • 显示模式
// model 分为:CardDatePickerDialog.CARD//卡片,CardDatePickerDialog.CUBE//方形,CardDatePickerDialog.STACK//顶部圆角
// model 允许直接传入drawable资源文件id作为弹窗的背景,如示例内custom
fun setBackGroundModel(model: Int)
复制代码
  • 设置主题颜色
fun setThemeColor(@ColorInt themeColor: Int)
复制代码
  • 设置显示值
fun setDisplayType(vararg types: Int)
复制代码
fun setDisplayType(types: MutableList<Int>)
复制代码
  • 设置默认时间
fun setDefaultTime(millisecond: Long)
复制代码
  • 设置范围最小值
fun setMinTime(millisecond: Long)
复制代码
  • 设置范围最大值
fun setMaxTime(millisecond: Long)
复制代码
  • 是否显示单位标签
fun showDateLabel(b: Boolean)
复制代码
  • 设置标签文字
/**
*示例
*setLabelText("年","月","日","时","分")
*setLabelText("年","月","日","时")
*setLabelText(month="月",hour="时")
*/
fun setLabelText(year:String=yearLabel,month:String=monthLabel,day:String=dayLabel,hour:String=hourLabel,min:String=minLabel)
复制代码
  • 设置是否循环滚动
/**
*示例(默认为true)
*setWrapSelectorWheel(false)
*setWrapSelectorWheel(DateTimeConfig.YEAR,DateTimeConfig.MONTH,wrapSelector = false)
*setWrapSelectorWheel(arrayListOf(DateTimeConfig.YEAR,DateTimeConfig.MONTH),false)
*/
fun setWrapSelectorWheel()
复制代码
  • 绑定选择监听
/**
*示例
*setOnChoose("确定")
*setOnChoose{millisecond->}
*setOnChoose("确定"){millisecond->}
*/
fun setOnChoose(text: String = "确定", listener: ((Long) -> Unit)? = null)
复制代码
  • 绑定取消监听
/**
*示例
*setOnCancel("取消")
*setOnCancel{}
*setOnCancel("取消"){}
*/
fun setOnCancel(text: String = "取消", listener: (() -> Unit)? = null)
复制代码

选择器 DateTimePicker

xml中

app:layout 为自定义选择器布局 可参考 定制 DateTimePicker

        <com.loper7.date_time_picker.DateTimePicker
            android:id="@+id/dateTimePicker"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout="@layout/layout_date_picker_segmentation"
            app:showLabel="true"
            app:textSize="16sp"
            app:themeColor="#FF8080" />
复制代码

代码中

  • 设置监听
    dateTimePicker.setOnDateTimeChangedListener { millisecond ->  }
复制代码

更多设置

  • 设置自定义选择器布局(注意:需要在dateTimePicker其他方法之前调用,否则其他方法将会失效)
 dateTimePicker.setLayout(R.layout.layout_date_picker_segmentation)//自定义layout resId
复制代码
  • 设置显示状态

DateTimePicker支持显示 年月日时分 五个选项的任意组合,显示顺序以此为年、月、日、时、分,setDisplayType中可无序设置。

     dateTimePicker.setDisplayType(intArrayOf(
            DateTimeConfig.YEAR,//显示年
            DateTimeConfig.MONTH,//显示月
            DateTimeConfig.DAY,//显示日
            DateTimeConfig.HOUR,//显示时
            DateTimeConfig.MIN))//显示分
复制代码
  • 设置默认选中时间
 dateTimePicker.setDefaultMillisecond(defaultMillisecond)//defaultMillisecond 为毫秒时间戳
复制代码
  • 设置允许选择的最小时间
  dateTimePicker.setMinMillisecond(minMillisecond)
复制代码
  • 设置允许选择的最大时间
  dateTimePicker.setMaxMillisecond(maxMillisecond)
复制代码
  • 是否显示label标签(选中栏 年月日时分汉字)
  dateTimePicker.showLabel(true)
复制代码
  • 设置主题颜色
  dateTimePicker.setThemeColor(ContextCompat.getColor(context,R.color.colorPrimary))
复制代码
  • 设置字体大小

设置的字体大小为选中栏的字体大小,预览字体会根据字体大小等比缩放

  dateTimePicker.setTextSize(15)//单位为sp
复制代码
  • 设置标签文字
  //全部
  dateTimePicker.setLabelText(" Y"," M"," D"," Hr"," Min")
  //指定
  dateTimePicker.setLabelText(min = "M")
复制代码

定制 DateTimePicker

说明

DateTimePicker 主要由至多6个 NumberPicker 组成,所以在自定义布局时,根据自己所需的样式摆放 NumberPicker 即可。以下为注意事项

开始定制

  • DateTimePicker 至多支持6个 NumberPicker ,你可以在xml中按需摆放1-6个 NumberPicker
  • 为了让 DateTimePicker 找到 NumberPicker ,需要在xml中为 NumberPicker 指定 idtag,规则如下
/**
 * year:np_datetime_year 
 * month:np_datetime_month
 * day:np_datetime_day 
 * hour:np_datetime_hour
 * minute:np_datetime_minute 
 * second:np_datetime_second 
 */
 android:id="@+id/np_datetime_year"  or  android:tag="np_datetime_year"
复制代码
  • 使用定制UI

CardDatePickerDialog 中使用

fun setPickerLayout(@NotNull layoutResId: Int)
复制代码

DateTimePicker 中使用

<com.loper7.date_time_picker.DateTimePicker
            android:id="@+id/dateTimePicker"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout="@layout/layout_date_picker_segmentation"
            />
复制代码

或者

 dateTimePicker.setLayout(R.layout.layout_date_picker_segmentation)//自定义layout resId
复制代码

XML示例

示例图片

更高的拓展性

如果以上自定义并不能满足你的需求,你还可以定制你自己的 DateTimePicker , 可参照 DateTimePicker.kt 定义你想要属性以及在代码内编写你的UI逻辑。选择器的各种逻辑约束抽离在 DateTimeController.kt ,你的 DateTimePicker 只需让 DateTimeController.kt 绑定 NumberPicker 即可。比如:

DateTimeController().bindPicker(YEAR, mYearSpinner)
            .bindPicker(MONTH, mMonthSpinner)
            .bindPicker(DAY, mDaySpinner).bindPicker(HOUR, mHourSpinner)
            .bindPicker(MIN, mMinuteSpinner).bindPicker(SECOND, mSecondSpinner).build()
复制代码

最后

关于 Date&Time Picker

他是去年疫情肆虐的时候诞生的,从编写他的第一行代码开始到现在已经快过了一年,到目前为止更新了10+次版本,每一次的更新的都使他更加稳定与完善。
在此代表他,向给他starissue的小伙伴们致以诚挚的感谢,每一个starissue都是他成长动力和足迹。
看到这里的你,可以移驾 Github 为他点亮右上角的star吗?

推荐

助你调教官方 Tablayout - Tablayout 拓展

文章分类
Android
文章标签