Skip to content

Commit

Permalink
1.修复设置最大年份后,当选择到最大年份时,月份为0的问题
Browse files Browse the repository at this point in the history
2.修复范围最大值,范围最小值,选中默认值之间冲突时约束异常问题(规则为:最大范围值与最小范围值存在冲突时,后设置的值不会生效;选中默认值与范围最大值/范围最小值存在冲突时,不会生效)
3.优化监听回调代码,使用kotlin特性,使回调更加简洁
  • Loading branch information
loper7 committed Sep 2, 2020
1 parent 89f4d79 commit 22bff81
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 27 deletions.
2 changes: 0 additions & 2 deletions app/src/main/java/com/loper7/datepicker/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,6 @@ class MainActivity : AppCompatActivity() {
"yyyy-MM-dd HH:mm"
)
} ${StringUtils.getWeek(it)}"

Log.i("TAG", "onCreate: $it")
}
.setOnCancel("关闭") {
}.build().show()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,19 @@ class DateTimePicker : FrameLayout {
private lateinit var mHourSpinner: NumberPicker
private lateinit var mMinuteSpinner: NumberPicker

private lateinit var mDate: Calendar
private var mYear = 0
private var mMonth = 0
private var mDay = 0
private var mHour = 0
private var mMinute = 0

private var minMillisecond = 0L
private var minMonth = 1
private var minDay = 1
private var minHour = 0
private var minMinute = 0

private var maxMillisecond = 0L
private var maxMonth = 12
private var maxDay = 31
private var maxHour = 23
Expand Down Expand Up @@ -76,28 +77,31 @@ class DateTimePicker : FrameLayout {
}

private fun init(context: Context) {
mDate = Calendar.getInstance()

val mDate = Calendar.getInstance()
mYear = mDate.get(Calendar.YEAR)
mMonth = mDate.get(Calendar.MONTH) + 1
mDay = mDate.get(Calendar.DAY_OF_MONTH)
mHour = mDate.get(Calendar.HOUR_OF_DAY)
mMinute = mDate.get(Calendar.MINUTE)
millisecond = mDate.timeInMillis
View.inflate(context, R.layout.view_date_picker, this)

mYearSpinner = findViewById(R.id.np_datetime_year)
mYearSpinner.label = yearLabel
mYearSpinner.maxValue = mYear + 100
mYearSpinner.minValue = 1800
mYearSpinner.label = yearLabel
mYearSpinner.value = mYear
mYearSpinner.isFocusable = true
mYearSpinner.isFocusableInTouchMode = true
mYearSpinner.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS //设置NumberPicker不可编辑
mYearSpinner.descendantFocusability =
NumberPicker.FOCUS_BLOCK_DESCENDANTS //设置NumberPicker不可编辑
mYearSpinner.setOnValueChangedListener(mOnYearChangedListener) //注册NumberPicker值变化时的监听事件

mMonthSpinner = findViewById(R.id.np_datetime_month)
mMonthSpinner.label = monthLabel
mMonthSpinner.maxValue = 12
mMonthSpinner.minValue = 1
mMonthSpinner.label = monthLabel
mMonthSpinner.value = mMonth
mMonthSpinner.isFocusable = true
mMonthSpinner.isFocusableInTouchMode = true
Expand All @@ -106,38 +110,36 @@ class DateTimePicker : FrameLayout {
mMonthSpinner.setOnValueChangedListener(mOnMonthChangedListener)

mDaySpinner = findViewById(R.id.np_datetime_day)
mDaySpinner.label = dayLabel
leapMonth() //判断是否闰年,从而设置2月份的天数
mDaySpinner.isFocusable = true
mDaySpinner.isFocusableInTouchMode = true
mDaySpinner.label = dayLabel
mDaySpinner.value = mDay
mDaySpinner.setFormatter(formatter)
mDaySpinner.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
mDaySpinner.setOnValueChangedListener(mOnDayChangedListener)

mHourSpinner = findViewById(R.id.np_datetime_hour)
mHourSpinner.label = hourLabel
mHourSpinner.maxValue = 23
mHourSpinner.minValue = 0
mHourSpinner.isFocusable = true
mHourSpinner.isFocusableInTouchMode = true
mHourSpinner.label = hourLabel
mHourSpinner.value = mHour
mHourSpinner.setFormatter(formatter)
mHourSpinner.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener)

mMinuteSpinner = findViewById(R.id.np_datetime_minute)
mMinuteSpinner.label = minLabel
mMinuteSpinner.maxValue = 59
mMinuteSpinner.minValue = 0
mMinuteSpinner.isFocusable = true
mMinuteSpinner.label = minLabel
mMinuteSpinner.isFocusableInTouchMode = true
mMinuteSpinner.value = mMinute
mMinuteSpinner.setFormatter(formatter)
mMinuteSpinner.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener)

refreshUI()
}

private fun refreshUI() {
Expand Down Expand Up @@ -170,29 +172,29 @@ class DateTimePicker : FrameLayout {
NumberPicker.OnValueChangeListener { _, _, _, _ ->
mYear = mYearSpinner.value
leapMonth()
limitMaxMin()
limitMaxAndMin()
onDateTimeChanged()
}

private val mOnMonthChangedListener =
NumberPicker.OnValueChangeListener { _, _, _, _ ->
mMonth = mMonthSpinner.value
leapMonth()
limitMaxMin()
limitMaxAndMin()
onDateTimeChanged()
}

private val mOnDayChangedListener =
NumberPicker.OnValueChangeListener { _, _, _, _ ->
mDay = mDaySpinner.value
limitMaxMin()
limitMaxAndMin()
onDateTimeChanged()
}

private val mOnHourChangedListener =
NumberPicker.OnValueChangeListener { _, _, _, _ ->
mHour = mHourSpinner.value
limitMaxMin()
limitMaxAndMin()
onDateTimeChanged()
}

Expand Down Expand Up @@ -267,7 +269,6 @@ class DateTimePicker : FrameLayout {
if (mYear == mYearSpinner.minValue && mMonth == mMonthSpinner.minValue) {
mDaySpinner.minValue = minDay
}
mDay = mDaySpinner.value
}

/**
Expand All @@ -292,7 +293,10 @@ class DateTimePicker : FrameLayout {

private val TAG = "DateTimePicker"

private fun limitMaxMin() {
/**
* 设置允许选择的区间
*/
private fun limitMaxAndMin() {
//设置月份最小值
mMonthSpinner.minValue =
if (mYear == mYearSpinner.minValue)
Expand Down Expand Up @@ -433,10 +437,10 @@ class DateTimePicker : FrameLayout {
*/
fun setDefaultMillisecond(time: Long) {
if (time <= 0) return
if (time < minMillisecond) return
if (maxMillisecond in 1 until time) return
val mCalendar = Calendar.getInstance()
time?.let {
mCalendar.timeInMillis = it
}
time.let { mCalendar.timeInMillis = it }

mYear = mCalendar.get(Calendar.YEAR)
mMonth = mCalendar.get(Calendar.MONTH) + 1
Expand All @@ -451,7 +455,7 @@ class DateTimePicker : FrameLayout {
mDaySpinner.value = mDay
mHourSpinner.value = mHour
mMinuteSpinner.value = mMinute
limitMaxMin()
limitMaxAndMin()
onDateTimeChanged()
}

Expand All @@ -462,6 +466,8 @@ class DateTimePicker : FrameLayout {
*/
fun setMinMillisecond(time: Long) {
if (time <= 0) return
if (maxMillisecond in 1 until time) return
minMillisecond = time
val mCalendar = Calendar.getInstance()
mCalendar.timeInMillis = time
minMonth = mCalendar.get(Calendar.MONTH) + 1
Expand All @@ -473,8 +479,8 @@ class DateTimePicker : FrameLayout {
mDaySpinner.minValue = minDay
mHourSpinner.minValue = minDay
mMinuteSpinner.minValue = minDay
limitMaxMin()
if (this.mDate.timeInMillis < mDate.timeInMillis) setDefaultMillisecond(time)
limitMaxAndMin()
if (this.millisecond < time) setDefaultMillisecond(time)
}

/**
Expand All @@ -484,6 +490,8 @@ class DateTimePicker : FrameLayout {
*/
fun setMaxMillisecond(time: Long) {
if (time <= 0) return
if (minMillisecond > 0L && time < minMillisecond) return
maxMillisecond = time
val mCalendar = Calendar.getInstance()
mCalendar.timeInMillis = time
maxMonth = mCalendar.get(Calendar.MONTH) + 1
Expand All @@ -495,8 +503,8 @@ class DateTimePicker : FrameLayout {
mDaySpinner.maxValue = maxDay
mHourSpinner.maxValue = maxHour
mMinuteSpinner.maxValue = maxMinute
limitMaxMin()
if (this.mDate.timeInMillis > mDate.timeInMillis) setDefaultMillisecond(time)
limitMaxAndMin()
if (this.millisecond > time) setDefaultMillisecond(time)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ class CardDatePickerDialog(context: Context) : BottomSheetDialog(context), View.
*/
fun setOnChoose(text: String = "确定", listener: ((Long) -> Unit)? = null): Builder {
this.onChooseListener = listener
this.chooseText = chooseText
this.chooseText = text
return this
}

Expand Down

0 comments on commit 22bff81

Please sign in to comment.