如何从 Android 中的第一个选择(点)验证 Material RangeDatePicker?
How to validate Material RangeDatePicker from first selection(point) in Android?
我想验证从第一次选择到 6 个月的范围日期选择器,但我不能。
试图通过此 'CalendarConstraints.Builder()'
捕获(检测)范围选择器上的第一个用户选择(日期)
val constDate = CalendarConstraints.Builder()
constDate.setValidator(object : CalendarConstraints.DateValidator {
...
//this code not work correctly
override fun isValid(date: Long): Boolean {
val calendar = Calendar.getInstance()
if (initTime == 0.toLong())
initTime = System.currentTimeMillis()
return if (System.currentTimeMillis() > initTime + 1000) {
Log.e("DateActivity", "isValid: 크다")
if (firstOrder == 0) {
firstSelect = date
firstOrder++
calendar.time = Date(firstSelect)
calendar.add(Calendar.MONTH, 6)
}
val remainDate = Calendar.getInstance()
remainDate.time = Date(date)
calendar > remainDate
} else {
Log.e("DateActivity", "isValid: 크지 않다.")
true
}
}
}
builder.setCalendarConstraints(constDate.build())
val picker = builder.build()
By time difference(System.currentTimeMillis()) try to catch first selection but when swipe picker other date catched in override fun isValid()
. so I tried setOnTouchListener{}
but no found way picker's setOnTouchListener in override fun isValid()
cause picker built after CalendarConstraints set.
这只是静态验证。我觉得。
现在,我不需要 7 个月前要求的这个功能,但我现在得到了。
//global
private const val RESET_TIME_MILLIS = 1500L
private var TERM_CALENDAR: Calendar = Calendar.getInstance()
private const val DAY_OF_TERM = 60
//prperties of Fragment or Activity
private val calendar = Calendar.getInstance()
private var firstSelect: Calendar? = null
private var secondSelect: Calendar? = null
//setValidator(below object)
object : CalendarConstraints.DateValidator {
private val dayList = arrayListOf<Calendar>()
private var job: Job? = null
override fun isValid(date: Long): Boolean {
if (job == null) {
job = lifecycleScope.launch {
delay(RESET_TIME_MILLIS)
if (secondSelect != null) {
firstSelect = null
secondSelect = null
}
dayList.clear()
}
} else {
if (job!!.isCompleted) {
job = null
}
}
calendar.time = Date(date)
val instancCal = Calendar.getInstance().apply {
time = Date(date)
}
dayList.add(instancCal)
if (calendar.dayOfMonth() == 1 && dayList.count() == 2) {
if (firstSelect == null) {
firstSelect = dayList[0]
TERM_CALENDAR.apply {
set(Calendar.YEAR, firstSelect!!.get(Calendar.YEAR))
set(Calendar.MONTH, firstSelect!!.get(Calendar.MONTH))
set(Calendar.DAY_OF_MONTH, firstSelect!!.get(Calendar.DAY_OF_MONTH))
add(
Calendar.DAY_OF_MONTH,
DAY_OF_TERM
)
}
} else if (secondSelect == null) {
secondSelect = dayList[0]
}
}
if (secondSelect != null) {
if (calendar in firstSelect!!..TERM_CALENDAR) {
return true
}
return false
}
return if (firstSelect == null) {
true
} else {
calendar in firstSelect!!..TERM_CALENDAR
}
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
}
}
是这样的(有效期从选择到60天)
我想验证从第一次选择到 6 个月的范围日期选择器,但我不能。
val constDate = CalendarConstraints.Builder()
constDate.setValidator(object : CalendarConstraints.DateValidator {
...
//this code not work correctly
override fun isValid(date: Long): Boolean {
val calendar = Calendar.getInstance()
if (initTime == 0.toLong())
initTime = System.currentTimeMillis()
return if (System.currentTimeMillis() > initTime + 1000) {
Log.e("DateActivity", "isValid: 크다")
if (firstOrder == 0) {
firstSelect = date
firstOrder++
calendar.time = Date(firstSelect)
calendar.add(Calendar.MONTH, 6)
}
val remainDate = Calendar.getInstance()
remainDate.time = Date(date)
calendar > remainDate
} else {
Log.e("DateActivity", "isValid: 크지 않다.")
true
}
}
}
builder.setCalendarConstraints(constDate.build())
val picker = builder.build()
By time difference(System.currentTimeMillis()) try to catch first selection but when swipe picker other date catched in
override fun isValid()
. so I triedsetOnTouchListener{}
but no found way picker's setOnTouchListener inoverride fun isValid()
cause picker built after CalendarConstraints set.
这只是静态验证。我觉得。
现在,我不需要 7 个月前要求的这个功能,但我现在得到了。
//global
private const val RESET_TIME_MILLIS = 1500L
private var TERM_CALENDAR: Calendar = Calendar.getInstance()
private const val DAY_OF_TERM = 60
//prperties of Fragment or Activity
private val calendar = Calendar.getInstance()
private var firstSelect: Calendar? = null
private var secondSelect: Calendar? = null
//setValidator(below object)
object : CalendarConstraints.DateValidator {
private val dayList = arrayListOf<Calendar>()
private var job: Job? = null
override fun isValid(date: Long): Boolean {
if (job == null) {
job = lifecycleScope.launch {
delay(RESET_TIME_MILLIS)
if (secondSelect != null) {
firstSelect = null
secondSelect = null
}
dayList.clear()
}
} else {
if (job!!.isCompleted) {
job = null
}
}
calendar.time = Date(date)
val instancCal = Calendar.getInstance().apply {
time = Date(date)
}
dayList.add(instancCal)
if (calendar.dayOfMonth() == 1 && dayList.count() == 2) {
if (firstSelect == null) {
firstSelect = dayList[0]
TERM_CALENDAR.apply {
set(Calendar.YEAR, firstSelect!!.get(Calendar.YEAR))
set(Calendar.MONTH, firstSelect!!.get(Calendar.MONTH))
set(Calendar.DAY_OF_MONTH, firstSelect!!.get(Calendar.DAY_OF_MONTH))
add(
Calendar.DAY_OF_MONTH,
DAY_OF_TERM
)
}
} else if (secondSelect == null) {
secondSelect = dayList[0]
}
}
if (secondSelect != null) {
if (calendar in firstSelect!!..TERM_CALENDAR) {
return true
}
return false
}
return if (firstSelect == null) {
true
} else {
calendar in firstSelect!!..TERM_CALENDAR
}
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
}
}
是这样的(有效期从选择到60天)