微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

日期和时间选择器对话框

如何解决日期和时间选择器对话框

我正在尝试通过对开始和结束时间使用单独的日期和时间选择器来设置事件的日期和时间。

开始日期和开始时间 结束日期和结束时间

我放在一起的代码更新了日期但时间没有改变

有人可以就这个问题进行指导吗?

谢谢

代码如下:

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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。