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