问题描述
我正在尝试通过对开始和结束时间使用单独的日期和时间选择器来设置事件的日期和时间。
开始日期和开始时间 结束日期和结束时间
我放在一起的代码更新了日期但时间没有改变
有人可以就这个问题进行指导吗?
谢谢
代码如下:
private val START_CAL_ID = 456
private lateinit var endCalendar: Calendar
private val END_CAL_ID = 678
private lateinit var endTimeCalendar: Calendar
私有 val 日历 = Calendar.getInstance()
private fun showCalendar(calendarId: Int) {
val datePicker = DatePickerDialog(
this,R.style.DateTimePickerTheme,{ datePicker: DatePicker,year: Int,month: Int,day: Int ->
if (calendarId == START_CAL_ID) {
startCalendar.set(year,month,day)
} else if (calendarId == END_CAL_ID) {
endCalendar.set(year,day)
}
updateDateFields()
},calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)
)
datePicker.show()
}
private fun showTime(calendarId: Int) {
val timePickerDialog = TimePickerDialog(
this,{ view: TimePicker?,hourOfDay: Int,minute: Int ->
if (calendarId == START_CAL_ID) {
startCalendar.set(hourOfDay,minute)
} else if (calendarId == END_CAL_ID) {
endCalendar.set(hourOfDay,minute)
}
updateTimeFields()
},calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),false
)
timePickerDialog.show()
}
更新应用中的字段,以正确的格式显示所选数据
private fun updateDateFields() {
val formatter = SimpleDateFormat("MMM dd,yyyy",Locale.getDefault())
findViewById<TextView>(R.id.editEventStartDate).text = formatter.format(startCalendar.time)
findViewById<TextView>(R.id.editEventEndDate).text = formatter.format(endCalendar.time)
}
private fun updateTimeFields() {
val timeFormatter = SimpleDateFormat("hh.mm a",Locale.getDefault())
findViewById<TextView>(R.id.editEventStartTime).text =
timeFormatter.format(startCalendar.time)
findViewById<TextView>(R.id.editEventEndTime).text = timeFormatter.format(endCalendar.time)
}
解决方法
您可以使用单独的帮助类获取时间和日期以获得更好和干净的代码。
日期选择器助手:
class DatePicker(var context: Context,var iface : DateTimePickerInterface?) :
DatePickerDialog.OnDateSetListener {
val selectedDate = Calendar.getInstance()
fun showDatePicker(){
val datePickerDialog = DatePickerDialog(
context,R.style.DateTimePickerTheme,this,selectedDate.get(Calendar.YEAR),selectedDate.get(Calendar.MONTH),selectedDate.get(Calendar.DAY_OF_MONTH)
)
datePickerDialog.show()
}
override fun onDateSet(p0: DatePicker?,year: Int,month: Int,day: Int) {
selectedDate.set(Calendar.YEAR,year)
selectedDate.set(Calendar.MONTH,month)
selectedDate.set(Calendar.DAY_OF_MONTH,day)
iface?.onDateTimeSelected(selectedDate)
}
interface DateTimePickerInterface {
fun onDateTimeSelected(calendar: Calendar)
}
}
您可以像这样在 Activity 或 Fragment 中使用它:
JustDatePicker(this@Activity,lang.toString(),object : JustDatePicker.DateTimePickerInterface {
override fun onDateTimeSelected(calendar: Calendar) {
val date : Date = calendar.time
//todo
}
}).showDatePicker()
类似于 TimePicker 类。
class JustTimePicker(var context: Context,var iface : TimePickerInterface?,var selectedTime: Calendar = Calendar.getInstance()) : TimePickerDialog.OnTimeSetListener {
fun showPicker(){
val timePickerDialog = TimePickerDialog(
context,selectedTime.get(Calendar.HOUR_OF_DAY),selectedTime.get(Calendar.MINUTE),true
)
timePickerDialog.show()
}
override fun onTimeSet(p0: TimePicker?,hour: Int,min: Int) {
selectedTime.set(Calendar.HOUR_OF_DAY,hour)
selectedTime.set(Calendar.MINUTE,min)
iface?.onTimeSelected(selectedTime)
}
interface TimePickerInterface {
fun onTimeSelected(calendar: Calendar)
}
}
最后在片段或活动中使用的时间选择器如下:
JustTimePicker(context!!,object : JustTimePicker.TimePickerInterface{
override fun onTimeSelected(calendar: Calendar) {
val time = calendar.time
//todo
}
}).showPicker()