当点击24小时版本的时间选择器时,时间选择器错误地选择了同一时间的12小时版本。

问题描述 投票:0回答:1

非常奇怪。我知道,这是执行代码。这是正在执行的代码。

(EDIT中的代码。)

一旦我选择了一个时间和日期,再做同样的操作,之前的输出文本和这个输出文本不同。

注意,用户设置的是24小时格式。

第一次做。

Selecting datetime the first time!

第一次做完后是这样的(忽略高亮的 "人",那是对联系人搜索机制的实现)。

Looks fine for the first time, as expected

然后,再做一次同样的事情(我发誓这是我第二次做,可能看起来是一样的)。

As expected for the second time

但这是什么怪东西?

Don't know what is happening here

Toasts确认我输入的时间都是24小时的if-clause,所以我认为选择正确的日期格式就可以了。另外要注意的是,如果是12小时格式,按照代码的建议,应该会有一个AMPM,但是在输出中并没有)。

我不知道怎么会出现这种情况。在这里,我想说的是,如果是12小时格式,那么就会出现代码所建议的AMPM,但在输出中却没有出现)。SimpleDateFormat 是在使用前就被实例化的,所以在其他地方乱来是不可能的,所以我认为这不是来自于 datePickerDialog.

有什么线索suggestionsideas吗?

EDIT:按照要求,这里是Adapter代码。我是新来的,所以请对我好一点:)相关的代码是在 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)
}

EDIT 2:之前我以为是SimpleDateFormat在这里出了问题。但实际上是TimePicker的问题。它在某种程度上错误地解释了对24小时按钮的点击,而将其对应的12小时按钮注册为输入。

例如,如果我第一次选择18:30作为时间,那么如果我第二次选择6:30作为时间,生成的时间仍然是18:30。但是,如果第三次改成18:30,现在登记的时间是6:30。

java android kotlin simpledateformat
1个回答
1
投票

我创建了一个 DateTimePickerSample 来帮助你。原来的问题是错误使用 HOURjava.util.Calendar. 使用 HOUR_OF_DAY 返回正确的结果。

Java文档

HOUR: :获取和设置的字段号,表示上午或下午的时间。 HOUR_OF_DAY: 说明:用于获取和设置的字段号,表示一天中的时间。

使用方法:DateTimePickerSample.kt

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.