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
相关产品推荐
相关产品推荐

