Диалоговое окно выбора даты и времени

#android #kotlin #datepicker #calendar #timepicker

Вопрос:

Я пытаюсь установить дату и время для события с помощью отдельных средств выбора даты и времени для времени начала и окончания.

Дата начала и Время начала Дата окончания и время окончания

Код, который я собрал, обновляет дату, но время не меняется

Может ли кто-нибудь помочь в решении этой проблемы?

Спасибо

Код приведен ниже:

 private val START_CAL_ID = 456
private lateinit var endCalendar: Calendar
private val END_CAL_ID = 678
private lateinit var endTimeCalendar: Calendar
 

личный календарь val = Календарь.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, month, 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, R.style.DateTimePickerTheme,
        { 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)
}
 

Ответ №1:

set(int,int) in Calendar принимает идентификатор поля в первом аргументе и значение во втором. Чтобы установить час и минуту, разделите их на два вызова, например

 startCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
startCalendar.set(Calendar.MINUTE, minute)
 

(Кроме того, рассмотрите возможность использования API java.time вместо этого. С ними гораздо приятнее работать.)

Ответ №2:

Вы можете использовать отдельные вспомогательные классы для получения времени и даты для более приятного и чистого кода.

Помощник по выбору Даты:

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

}
 

Вы можете использовать его в действии или фрагменте, подобном этому:

     JustDatePicker(this@Activity,lang.toString(),object : JustDatePicker.DateTimePickerInterface {
                    override fun onDateTimeSelected(calendar: Calendar) {
                        val date : Date = calendar.time
                        //todo
                    }
    
                }).showDatePicker()
 

Аналогично классу хронометриста.

    class JustTimePicker(var context: Context, var iface : TimePickerInterface?,var  selectedTime: Calendar = Calendar.getInstance()) : TimePickerDialog.OnTimeSetListener {


    fun showPicker(){

        val timePickerDialog = TimePickerDialog(
            context,
            this,
            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()