TimePicker неправильно выбирает 12-часовую версию того же времени при нажатии на 24-часовую версию - PullRequest
0 голосов
/ 30 апреля 2020

Очень странно. Я знаю. Это исполняемый код.

(Код в РЕДАКТИРОВАТЬ.)

После того, как я выберу время и дату и сделаю то же самое снова, предыдущий выходной текст отличается от этого выходного текста.

Обратите внимание, что пользовательская настройка имеет формат 24 часа.

В первый раз, когда это делается:

Selecting datetime the first time!

Вот как он выглядит после выполнения в первый раз (игнорируйте выделенное «лицо», то есть реализацию механизма поиска контактов):

Looks fine for the first time, as expected

THEN, снова то же самое (клянусь, это второй раз, когда я делаю это, это может выглядеть так же):

As expected for the second time

Но что это monstrosity?!

Don't know what is happening here

Тосты подтверждают, что оба раза я вхожу в 24-часовое условие if, поэтому я думаю, что выбор правильного формата для дата в порядке. (Также обратите внимание, что, если бы это был 12-часовой формат, AM / PM был бы там, как предложено в коде, но его нет в выходных данных.)

Я не знаю, как это могло произойти , SimpleDateFormat создается непосредственно перед использованием, поэтому возиться с ним где-либо еще невозможно, поэтому я не думаю, что это исходит от datePickerDialog.

Какие-либо подсказки / предложения / идеи?

РЕДАКТИРОВАТЬ: По запросу, вот код адаптера. Я новичок, поэтому, пожалуйста, go спокойно для меня :) Соответствующий код находится в fun setDateTime()


class ContactAdapter(
    private val context: Context,
    private val contact_name: String?,
    private val items: List<Contact>
) :
    RecyclerView.Adapter<ContactAdapter.ViewHolder>() {
    private val c = Calendar.getInstance()
    fun createDatePicker(onSetDate: (DatePicker, Int, Int, Int) -> Unit) = DatePickerDialog(
        context,
        onSetDate,
        c[Calendar.YEAR],
        c[Calendar.MONTH],
        c[Calendar.DAY_OF_MONTH]
    )

    fun createTimePicker(onSetTime: (TimePicker, Int, Int) -> Unit) = TimePickerDialog(
        context,
        onSetTime,
        c[Calendar.HOUR],
        c[Calendar.MINUTE],
        DateFormat.is24HourFormat(context)
    )

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        init {
            setupAddButton()
            setupGreetingTimeText()
        }

        private fun setDateTime() {
            val datePicker = createDatePicker { _, year, month, date ->
                c[Calendar.YEAR] = year
                c[Calendar.MONTH] = month
                c[Calendar.DAY_OF_MONTH] = date

                val timePicker = createTimePicker { _, hour, minute ->
                    c[Calendar.HOUR] = hour
                    c[Calendar.MINUTE] = minute
                    itemView.txtGreetingTime.text = if (DateFormat.is24HourFormat(context)) {
                        Toast.makeText(context, "Chose 24-hour clause", Toast.LENGTH_SHORT).show()
                        SimpleDateFormat(
                            "dd mmm, yyyy 'at' HH:mm",
                            Locale.getDefault()
                        ).format(c.time)
                    } else {
                        Toast.makeText(context, "Chose 12-hour clause", Toast.LENGTH_SHORT).show()
                        SimpleDateFormat(
                            "dd mmm, yyyy 'at' hh:mm aa",
                            Locale.getDefault()
                        ).format(c.time)
                    }
                }

                // Do time picking stuff
                timePicker.show()

            }
            // Do date picking stuff
            datePicker.show()

        }
        private fun setupAddButton() {
            itemView.addButton.setOnClickListener {
                println("Attempted call to ${itemView.contactPhone.text}")
                itemView.layoutTimingDetails.visibility =
                    if (itemView.layoutTimingDetails.visibility == View.VISIBLE) View.GONE else View.VISIBLE

            }
        }

        private fun setupGreetingTimeText() {
            itemView.txtGreetingTime.setOnClickListener {
                it.txtGreetingTime.text = dateTimeToString()
            }
        }

        fun setData(item: Contact, contact_name: String?) {
            itemView.contactName.text = item.name
            itemView.contactPhone.text = item.phone
            itemView.contactEmail.text = item.email

            if (contact_name != null)
                itemView.contactName.highlightBackground(contact_name, Color.YELLOW)
        }
    }

    override fun getItemCount(): Int = items.size
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
        ViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.card_contact, parent, false)
        )

    override fun onBindViewHolder(holder: ViewHolder, position: Int) =
        holder.setData(items[position], contact_name)
}

РЕДАКТИРОВАТЬ 2: Ранее я думал, что SimpleDateFormat был здесь виноват. Но на самом деле это TimePicker. Это как-то неправильно интерпретирует щелчок на 24-часовых кнопках и вместо этого регистрирует их 12-часовые кнопки в качестве входных данных.

Пример, если в первый раз я выбрал 18:30, то если я выбрал 6:30 в качестве время во второй раз, время генерируется еще 18:30. Однако если третий раз изменить на 18:30, то зарегистрированное время будет 6:30.

1 Ответ

1 голос
/ 30 апреля 2020

Я создал DateTimePickerSample, чтобы помочь вам. Первоначальная проблема была неправильным использованием HOUR из java.util.Calendar. Использование HOUR_OF_DAY возвращает правильные результаты.

С Java Документация

HOUR: номер поля для получения и установки с указанием часов утра или днем HOUR_OF_DAY: номер поля для получения и установки с указанием часа дня.

Использование:

val picker = DateTimePickerSample(this)
picker.pickDateTime(
    usePreviousCalendar = true,
    callback = object: DateTimePickerSample.Callback {

        override fun onDateTimeSetSet(dateTimeStr: String, is24HourFormat: Boolean) {
            Log.d("Duh", "date=$dateTimeStr, is24HourFormat=$is24HourFormat")
        }
    }
)

DateTimePickerSample.kt

import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Context
import android.text.format.DateFormat
import android.widget.DatePicker
import android.widget.TimePicker
import java.text.SimpleDateFormat
import java.util.*

class DateTimePickerSample(
    private val context: Context
) : DatePickerDialog.OnDateSetListener,
    TimePickerDialog.OnTimeSetListener {

    interface Callback {
        fun onDateTimeSetSet(dateTimeStr: String, is24HourFormat: Boolean)
    }

    private var callback: Callback? = null
    private var calendar = Calendar.getInstance()

    private val is24HourFormat = DateFormat.is24HourFormat(context)

    fun pickDateTime(usePreviousCalendar: Boolean, callback: Callback) {
        this.callback = callback
        if (!usePreviousCalendar) {
            this.calendar = Calendar.getInstance()
        }

        val datePickerDialog = createDatePicker()
        datePickerDialog.show()
    }

    private fun createDatePicker(): DatePickerDialog {
        return DatePickerDialog(
            context,
            this,
            calendar[Calendar.YEAR],
            calendar[Calendar.MONTH],
            calendar[Calendar.DAY_OF_MONTH]
        )
    }

    private fun createTimePicker(): TimePickerDialog {
        return TimePickerDialog(
            context,
            this,
            calendar[Calendar.HOUR_OF_DAY],
            calendar[Calendar.MINUTE],
            is24HourFormat
        )
    }

    /*
     * DatePickerDialog.OnDateSetListener
     */

    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
        calendar[Calendar.YEAR] = year
        calendar[Calendar.MONTH] = month
        calendar[Calendar.DAY_OF_MONTH] = dayOfMonth

        val timePickerDialog = createTimePicker()
        timePickerDialog.show()
    }

    /*
     * TimePickerDialog.OnTimeSetListener
     */

    override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
        calendar[Calendar.HOUR_OF_DAY] = hourOfDay
        calendar[Calendar.MINUTE] = minute

        val dateFormatter = if (is24HourFormat) {
            SimpleDateFormat("dd mmm, yyyy 'at' HH:mm", Locale.getDefault())
        } else {
            SimpleDateFormat("dd mmm, yyyy 'at' hh:mm aa", Locale.getDefault())
        }

        val dateTimeStr = dateFormatter.format(calendar.time)
        callback?.onDateTimeSetSet(dateTimeStr, is24HourFormat)
    }
}
...