有谁知道在 Android DatePicker 中是否可以:
a) 让用户只选择给定的日期 block 。例如,用户点击“W”日,然后我们会自动突出显示星期天 -> 星期五日期范围(选择每一天)
b) 在 DatePicker 的标题中,显示选定的日期范围。
例如。 1 月 14 日星期日 - 1 月 19 日星期五
非常感谢任何人对此的帮助/建议。
最佳答案
给 future 的读者!
居然用新的android material design components您想要达到的目标可以使用 MaterialDatePicker
来实现.这是一个 对话框,而不是像 android.widget.DatePicker
这样的自定义 View .
步骤
1. 将 Material 依赖添加到模块的 gradle 文件
implementation 'com.google.android.material:material:1.1.0-beta01'
2.更改应用主题以继承 Material 主题的版本。
前任:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
3. 使用以下代码启动对话框。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupRangePickerDialog()
}
private fun setupRangePickerDialog() {
val builderRange = MaterialDatePicker.Builder.dateRangePicker()
builderRange.setCalendarConstraints(limitRange().build())
val pickerRange = builderRange.build()
pickerRange.show(supportFragmentManager, pickerRange.toString())
}
/*
Limit selectable range to Oct 17 - Nov 20 2019
*/
private fun limitRange(): CalendarConstraints.Builder {
val constraintsBuilderRange = CalendarConstraints.Builder()
val calendarStart: Calendar = Calendar.getInstance()
val calendarEnd: Calendar = Calendar.getInstance()
val year = 2019
val startMonth = 10
val startDate = 17
val endMonth = 11
val endDate = 20
calendarStart.set(year, startMonth - 1, startDate - 1)
calendarEnd.set(year, endMonth - 1, endDate)
val minDate = calendarStart.timeInMillis
val maxDate = calendarEnd.timeInMillis
constraintsBuilderRange.setStart(minDate)
constraintsBuilderRange.setEnd(maxDate)
constraintsBuilderRange.setValidator(RangeValidator(minDate, maxDate))
return constraintsBuilderRange
}
}
class RangeValidator(private val minDate:Long, private val maxDate:Long) : CalendarConstraints.DateValidator{
constructor(parcel: Parcel) : this(
parcel.readLong(),
parcel.readLong()
)
override fun writeToParcel(dest: Parcel?, flags: Int) {
TODO("not implemented")
}
override fun describeContents(): Int {
TODO("not implemented")
}
override fun isValid(date: Long): Boolean {
return !(minDate > date || maxDate < date)
}
companion object CREATOR : Parcelable.Creator<RangeValidator> {
override fun createFromParcel(parcel: Parcel): RangeValidator {
return RangeValidator(parcel)
}
override fun newArray(size: Int): Array<RangeValidator?> {
return arrayOfNulls(size)
}
}
}
关于android - 在 Android 上的 DatePicker 中显示选定的日期范围(+ 作为标题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573441/