You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何设置DatePicker的最小可选日期为100年前适配生日场景

Android Kotlin DatePicker生日选择范围适配方案

问题根因

  • 原有逻辑时间范围设置颠倒:生日场景需要最小可选日期为100年前,最大为当前日期,原代码设置为当前到100年后
  • 存在隐藏bug:日期选择回调中给Calendar的MONTH字段额外加1,会导致最终显示月份比实际选择大1个月(系统返回的month本身为0-11取值,符合Calendar字段要求,无需额外加1)
  • 赋值顺序错误:原代码先给minDate、maxDate赋值,再修改日历时间,导致范围调整不生效

修正后完整Kotlin代码

class ThirdActivity : AppCompatActivity() {
    lateinit var edt :EditText
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_third)

        edt = findViewById(R.id.edt_birthday)
        edt.setOnClickListener {
            // 取当前时间作为日期选择器默认值和最大日期基准
            val currentCalendar = Calendar.getInstance()
            val defaultYear = currentCalendar.get(Calendar.YEAR)
            val defaultMonth = currentCalendar.get(Calendar.MONTH)
            val defaultDay = currentCalendar.get(Calendar.DAY_OF_MONTH)

            val dialog = DatePickerDialog(this,AlertDialog.THEME_HOLO_LIGHT,{_, selectYear, selectMonth, selectDay ->
                // 处理选中日期,month无需额外加1
                val resultCalendar = Calendar.getInstance()
                resultCalendar.set(selectYear, selectMonth, selectDay)
                val myFormat = "dd/MM/yyyy"
                val sdf = SimpleDateFormat(myFormat,Locale.getDefault())
                edt.setText(sdf.format(resultCalendar.time))
            }, defaultYear, defaultMonth, defaultDay)
            
            // 计算100年前的时间作为最小可选日期
            val minCalendar = Calendar.getInstance()
            minCalendar.add(Calendar.YEAR, -100)
            dialog.datePicker.minDate = minCalendar.timeInMillis
            // 当前时间作为最大可选日期,禁止选择未来日期
            dialog.datePicker.maxDate = currentCalendar.timeInMillis
            
            dialog.show()
        }
    }
}

布局文件无需改动,可直接复用原有代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ThirdActivity">

    <EditText
        android:id="@+id/edt_birthday"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="380dp"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:gravity="center"
        android:hint="Choose your birthday"
        android:inputType="text"
        android:textColor="@color/black"
        android:textSize="15sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

内容的提问来源于stack exchange,提问作者Yellow Clock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:54:05