android - 在 Android 上的 DatePicker 中显示选定的日期范围(+ 作为标题)

标签 android datepicker

有谁知道在 Android DatePicker 中是否可以:

a) 让用户只选择给定的日期 block 。例如,用户点击“W”日,然后我们会自动突出显示星期天 -> 星期五日期范围(选择每一天)

b) 在 DatePicker 的标题中,显示选定的日期范围。
例如。 1 月 14 日星期日 - 1 月 19 日星期五

非常感谢任何人对此的帮助/建议。

enter image description here

最佳答案

给 future 的读者!

居然用新的android material design components您想要达到的目标可以使用 MaterialDatePicker 来实现.这是一个 对话框,而不是像 android.widget.DatePicker 这样的自定义 View .

restricted datepicker range

步骤

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/

相关文章:

Android应用程序如何在应用程序内部存储和获取文件

wpf - 根据保存在数据库中更改 datepicker 日期格式

java - 创建一个每 x 秒执行一次的方法

内置 ListView 的 Android CardView - CardView 上的 onTouchListener 无法正常工作

android - 房间数据库: Multiple delete query crashes app

JavaScript 数组不工作?使困惑

Foundation 4 的日期选择器?

java - 我的微调器在添加从 firebase 数据库中选择的多个值时被覆盖

css - jQuery UI Datepicker - 选定日期之后的颜色日期

javascript - Twitter Bootstrap 的日历/日期和时间选择器