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
相关产品推荐
相关产品推荐

