EditText选择日期始终显示当前日期问题求助(附实现代码)
问题排查:DatePickerDialog选择日期后显示当前日期的解决方法
嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来拆解:
问题根源
- 日期格式化用错了数据源:你在
OnDateSetListener回调里,还是用了一开始创建的calendar实例(这个实例从始至终都是当前系统日期,根本没更新成用户选中的日期),所以etDob.setText()永远显示当前日期。 - 年龄校验逻辑也有坑:你创建
userAge时用的year, month, day是初始的当前日期参数,不是用户通过DatePicker选中的日期(而且参数名重名了,很容易搞混!)。
修正后的完整代码
etDob.setOnClickListener { // 获取当前日期,变量名改成current开头,避免和回调里的参数重名 val calendar = Calendar.getInstance() val currentYear = calendar.get(Calendar.YEAR) val currentMonth = calendar.get(Calendar.MONTH) val currentDay = calendar.get(Calendar.DAY_OF_MONTH) val dpd = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view, selectedYear, selectedMonth, selectedDay -> val myFormat: String = "MM/dd/yyyy" val sdf = SimpleDateFormat(myFormat, Locale.US) // 关键:用选中的日期创建新的Calendar实例,用来格式化 val selectedCalendar = Calendar.getInstance() selectedCalendar.set(selectedYear, selectedMonth, selectedDay) val dob = sdf.format(selectedCalendar.getTime()) etDob!!.setText(dob) // 修正年龄校验:用选中的日期来计算年龄 val userAge = GregorianCalendar(selectedYear, selectedMonth, selectedDay) val minAdultAge = GregorianCalendar() minAdultAge.add(Calendar.YEAR, -18) // 注意:这里修正了判断逻辑,原逻辑写反了 if (userAge.before(minAdultAge)) { Toast.makeText(this, "未满18岁", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "已成年", Toast.LENGTH_SHORT).show() } }, currentYear, currentMonth, currentDay) dpd.datePicker.maxDate = Calendar.getInstance().timeInMillis dpd.show() }
关键修改点说明
- 日期显示修正:在回调里新建了
selectedCalendar,把用户选中的selectedYear, selectedMonth, selectedDay设置进去,再用这个Calendar来格式化日期,这样etDob就会显示用户真正选的日期了。 - 年龄校验修正:用回调传入的选中日期参数创建
userAge,同时修正了判断逻辑——原代码的逻辑写反了,userAge.before(minAdultAge)才代表用户出生日期早于18年前,也就是未满18岁。 - 变量名优化:把初始的当前日期变量改成
currentYear这类名字,和回调里的selectedYear区分开,避免变量名重名导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者V K
相关产品推荐
相关产品推荐

