DatePicker 对话框可能会在 kotlin 中显示不正确的日期

DatePicker dialog may showing improper date in kotlin

下面是我用来在 android 中显示日期选择器对话框的函数。

private fun openPurchaseDatePickerDialog(
    yearToDisplay: Int,
    monthToDisplay: Int,
    dayToDisplay: Int
) {
    try {
        activity?.let { KeyboardUtils.hideKeyboard(it) }
        val calendar = Calendar.getInstance()
        val dialog = DatePickerDialog(activity, { _, year, month, day_of_month ->
            calendar[Calendar.YEAR] = year
            calendar[Calendar.MONTH] = month
            calendar[Calendar.DAY_OF_MONTH] = day_of_month
            val myFormat = "" + DateUtils.OverAllAppDateDisplayFormat
            val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
            edtPurchaseDate.setText(sdf.format(calendar.time).toString())
            spIntendedUse.isFocusable = true
        }, yearToDisplay, monthToDisplay, dayToDisplay)
        dialog.updateDate(yearToDisplay,monthToDisplay,dayToDisplay)
        dialog.datePicker.maxDate = calendar.timeInMillis
        dialog.show()
    } catch (e: Exception) {
        e.printStackTrace()
    }

如上所述,您可以检查此函数中是否传递了三个参数。

我必须在 DatePicker 对话框中显示具体日期显示我已经传递了这三个参数。

表示如果用户第一次选择日期,将设置默认值或设置当前日期。

如果 edittext 已经选择了一个文本而不是空的,我正在做如下:

if (edtPurchaseDate.text.toString().isNullOrEmpty()) {
                        val calendar = Calendar.getInstance()
                        openPurchaseDatePickerDialog(
                            calendar[Calendar.YEAR],
                            calendar[Calendar.MONTH],
                            calendar[Calendar.DAY_OF_MONTH]
                        )
                    } else {
                        var dateArr = edtPurchaseDate.text.toString().split("-")
                        openPurchaseDatePickerDialog(
                            dateArr[2].toInt(),
                            dateArr[1].toInt(),
                            dateArr[0].toInt()
                        )
                    }

但是,当日期选择器对话框打开时,它仍然显示选择为今天而不是自定义。

可能是什么问题?

你可以看到我也试过 updateDate() 函数如下:

dialog.updateDate(yearToDisplay,monthToDisplay,dayToDisplay)

谢谢。

不完全确定这里的 updateDate 方法问题。但是要解决此问题,您可以在初始化期间使用相同的 Calendar 对象,它应该可以正常工作。 我稍微修改了你的方法。

private fun openPurchaseDatePickerDialog(date: String) {
    try {
        val calendar = Calendar.getInstance()
        if (date.isNotBlank()) {
           try {
               calendar.time = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).parse(date)!!
           }catch (e:ParseException){
           }
        }
        val dialog = DatePickerDialog(this, { _, year, month, day_of_month ->
            calendar[Calendar.YEAR] = year
            calendar[Calendar.MONTH] = month
            calendar[Calendar.DAY_OF_MONTH] = day_of_month
            val myFormat = "dd-MM-yyyy"
            val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
            edtPurchaseDate.setText(sdf.format(calendar.time).toString())
        }, calendar[Calendar.YEAR], calendar[Calendar.MONTH], calendar[Calendar.DAY_OF_MONTH])
        dialog.datePicker.maxDate = System.currentTimeMillis()
        dialog.show()
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

现在,当您调用它时,您只需使用一个值来调用它,而不必拆分字符串。

openPurchaseDatePickerDialog(edtPurchaseDate.text.toString())