You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Kotlin中DatePickerDialog的两个问题及优化需求

解决Android Kotlin中DatePickerDialog俄语区域与日期回显问题

我是编程新手,正在学习Android Kotlin开发,开发待办事项App时遇到两个问题:

  • 让DatePickerDialog使用俄语区域设置,日期显示格式为「日:俄语月份:年」
  • 确保DatePickerDialog支持选择任意日期,且所选日期能正确回显到id为datePickerEditText的EditText中

我尝试了两个方案,但都有缺陷:

  • 方案1:能支持选择任意日期并正确回显,但未使用俄语区域和格式
  • 方案2:实现了俄语格式,但无论选择哪个日期,EditText始终显示当前日期

修改后的完整代码

import android.app.DatePickerDialog
import android.app.Dialog
import android.icu.util.Calendar
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.Button
import android.widget.EditText
import java.text.SimpleDateFormat
import java.util.Locale

class CustomDialog(var activity: MainActivity) : Dialog(activity), View.OnClickListener {

    var yes: Button? = null
    var no: Button? = null
    private lateinit var inputField: EditText
    private lateinit var inputDescription: EditText
    private lateinit var editTextDate: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.dialog_template)
        inputField = findViewById(R.id.dialogInput)
        inputDescription = findViewById(R.id.dialogDescription)

        val lp = WindowManager.LayoutParams()
        lp.copyFrom(this.window?.attributes)
        lp.width = WindowManager.LayoutParams.MATCH_PARENT
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT
        lp.gravity = Gravity.CENTER
        this.window?.attributes = lp

        yes = findViewById<Button>(R.id.dialogOkButton)
        no = findViewById<Button>(R.id.dialogCancelButton)
        editTextDate = findViewById(R.id.datePickerEditText)
        yes?.setOnClickListener(this)
        no?.setOnClickListener(this)

        editTextDate.setOnClickListener {
            val c = Calendar.getInstance()
            val year = c.get(Calendar.YEAR)
            val month = c.get(Calendar.MONTH)
            val day = c.get(Calendar.DAY_OF_MONTH)

            val datePickerDialog = DatePickerDialog(
                activity,
                { _, selectedYear, selectedMonth, selectedDay ->
                    // 创建新的Calendar实例,设置用户选择的日期
                    val selectedCalendar = Calendar.getInstance().apply {
                        set(Calendar.YEAR, selectedYear)
                        set(Calendar.MONTH, selectedMonth)
                        set(Calendar.DAY_OF_MONTH, selectedDay)
                    }
                    // 按「日:俄语月份:年」格式格式化日期
                    val dateFormat = SimpleDateFormat("dd:MMMM:yyyy", Locale("ru"))
                    val formattedDate = dateFormat.format(selectedCalendar.time)
                    editTextDate.setText(formattedDate)
                },
                year,
                month,
                day
            )
            // 设置DatePickerDialog为俄语区域
            datePickerDialog.datePicker.locale = Locale("ru")
            datePickerDialog.show()
        }
    }

    override fun onClick(view: View) {
        when (view.id) {
            R.id.dialogOkButton -> {
                val inputResult = inputField.text
                val inputDescription = inputDescription.text
                val inputDate = editTextDate.text
                activity.addItem(inputResult.toString(), inputDescription.toString(), inputDate.toString())
                dismiss()
            }
            R.id.dialogCancelButton -> dismiss()
        }
    }
}

核心修改说明

  • 设置俄语区域:通过datePickerDialog.datePicker.locale = Locale("ru")让DatePickerDialog的界面(月份名称、按钮文字等)显示俄语
  • 正确处理选择日期:在回调中创建新的Calendar实例,设置用户选择的年、月、日,避免复用初始的当前日期实例
  • 指定俄语日期格式:使用SimpleDateFormat("dd:MMMM:yyyy", Locale("ru")),其中MMMM会生成俄语完整月份名称,完全匹配「日:俄语月份:年」的要求
  • 修复语法错误:修正原代码中Lambda表达式箭头-为正确的->,确保代码可正常编译

内容的提问来源于stack exchange,提问作者ilyamio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:37:49