非常奇怪。我知道,这是执行代码。这是正在执行的代码。
(EDIT中的代码。)
一旦我选择了一个时间和日期,再做同样的操作,之前的输出文本和这个输出文本不同。
注意,用户设置的是24小时格式。
第一次做。
第一次做完后是这样的(忽略高亮的 "人",那是对联系人搜索机制的实现)。
然后,再做一次同样的事情(我发誓这是我第二次做,可能看起来是一样的)。
但这是什么怪东西?
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。
我创建了一个 DateTimePickerSample
来帮助你。原来的问题是错误使用 HOUR
从 java.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)
}
}