【问题标题】:Display a selected date range (+ as the header) in DatePicker on Android在 Android 上的 DatePicker 中显示选定的日期范围(+ 作为标题)
【发布时间】:2018-02-01 23:30:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android datepicker


    【解决方案1】:

    给未来的读者!

    实际上,使用新的android material design components,您想要实现的目标可以使用MaterialDatePicker 来实现。这是一个对话框,而不是像 android.widget.DatePicker 这样的自定义视图。


    步骤

    1.将材料依赖添加到模块的 gradle 文件中

    implementation 'com.google.android.material:material:1.1.0-beta01'
    

    2。更改应用主题以继承材料主题的版本。

    例如:

    <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)
            }
        }
    
    }
    

    【讨论】:

    • 这不符合 OP 的要求。它所做的只是将选择限制在一个日期范围内。 OP 要求选择一个日期以突出显示选定的一周
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多