Android DatePicker实现结束日期自动为起始日期后一天
Android实现起始日期选择后自动设置结束日期为次日
需求说明
- 用户选择任意起始日期后,点击选择结束日期时,结束日期需自动设为起始日期的后一天
现有代码
private fun showDatePickerDialog(type: Int) { calendar = Calendar.getInstance() year = calendar!!.get(Calendar.YEAR) month = calendar!!.get(Calendar.MONTH) dayOfMonth = calendar!!.get(Calendar.DAY_OF_MONTH) datePickerDialog = DatePickerDialog( requireContext(), R.style.MyDatePickerStyle, { datePicker, year, month, day -> if (type == 0){ var month = month + 1 var startMonthConverted = ""+month var startDayConverted = ""+day if(month<10){ startMonthConverted = "0$startMonthConverted" } if(day<10){ startDayConverted= "0$startDayConverted" } binding.txtStartDate.setText("$year-$startMonthConverted-$startDayConverted") } else { var month = month + 1 var monthConverted = ""+month var dayConverted = ""+day if(month<10){ monthConverted = "0$monthConverted"; } if(day<10){ dayConverted = "0$dayConverted" } binding.txtEndDate.setText("$year-$monthConverted-$dayConverted") } }, year, month, dayOfMonth ) if (type == 0) { val startDay = Calendar.getInstance() startDay.add(Calendar.DAY_OF_YEAR, 2); datePickerDialog!!.datePicker.minDate = startDay.timeInMillis } else { val endDay = Calendar.getInstance() endDay.add(Calendar.DATE, 2) // datePickerDialog!!.datePicker.minDate = endDay.timeInMillis datePickerDialog!!.getDatePicker().setMinDate(endDay.getTimeInMillis()); } val df: DateFormat = SimpleDateFormat("'T'HH:mm:ss.SSS") currentTime = df.format(Calendar.getInstance().timeInMillis) Log.d("TAG", "currentTime:$currentTime ") datePickerDialog!!.show() //set OK/Cancel buttons color //set OK/Cancel buttons color datePickerDialog!!.getButton(Dialog.BUTTON_POSITIVE) .setTextColor(android.graphics.Color.BLACK) datePickerDialog!!.getButton(Dialog.BUTTON_NEGATIVE) .setTextColor(android.graphics.Color.BLACK) }
问题分析
当前代码没有关联起始日期和结束日期的逻辑,打开结束日期选择器时只是设置了固定的最小日期(当前日期加2天),无法实现自动将结束日期设为起始日期次日的需求。同时日期格式化代码重复,冗余度高。
优化后的实现代码
// 全局变量保存用户选择的起始日期Calendar实例 private var startCalendar: Calendar? = null private fun showDatePickerDialog(type: Int) { val calendar = Calendar.getInstance() // 如果是打开结束日期选择器,且已选起始日期,默认选中起始日期的次日 if (type == 1 && startCalendar != null) { calendar.time = startCalendar!!.time calendar.add(Calendar.DAY_OF_MONTH, 1) } val year = calendar.get(Calendar.YEAR) val month = calendar.get(Calendar.MONTH) val dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH) val datePickerDialog = DatePickerDialog( requireContext(), R.style.MyDatePickerStyle, { _, selectedYear, selectedMonth, selectedDay -> val selectedCalendar = Calendar.getInstance().apply { set(selectedYear, selectedMonth, selectedDay) } // 统一日期格式化,避免重复拼接 val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) val formattedDate = dateFormat.format(selectedCalendar.time) if (type == 0) { binding.txtStartDate.text = formattedDate startCalendar = selectedCalendar // 保存起始日期 } else { binding.txtEndDate.text = formattedDate } }, year, month, dayOfMonth ) // 设置日期选择范围 if (type == 0) { val minStartDate = Calendar.getInstance() minStartDate.add(Calendar.DAY_OF_YEAR, 2) // 保留原逻辑:起始日期至少为后天 datePickerDialog.datePicker.minDate = minStartDate.timeInMillis } else { startCalendar?.let { // 已选起始日期时,结束日期最小为起始日期次日 val minEndDate = Calendar.getInstance().apply { time = it.time add(Calendar.DAY_OF_MONTH, 1) } datePickerDialog.datePicker.minDate = minEndDate.timeInMillis } ?: run { // 未选起始日期时,沿用原逻辑设置默认最小日期 val defaultMinEndDate = Calendar.getInstance() defaultMinEndDate.add(Calendar.DATE, 2) datePickerDialog.datePicker.minDate = defaultMinEndDate.timeInMillis } } // 设置按钮颜色 datePickerDialog.getButton(Dialog.BUTTON_POSITIVE).setTextColor(android.graphics.Color.BLACK) datePickerDialog.getButton(Dialog.BUTTON_NEGATIVE).setTextColor(android.graphics.Color.BLACK) datePickerDialog.show() }
关键修改点
- 新增
startCalendar变量保存起始日期的Calendar实例,方便后续计算结束日期 - 打开结束日期选择器时,自动将初始选中日期设为起始日期的次日,满足需求
- 统一日期格式化逻辑,替换冗余的字符串拼接,代码更简洁可靠
- 结束日期的最小日期关联起始日期,确保用户无法选择早于起始日期次日的日期
- 移除了与需求无关的
currentTime日志代码
内容的提问来源于stack exchange,提问作者Mehmet Hikmet
相关产品推荐
相关产品推荐

