Kotlin如何实现点击EditText弹出适配系统语言的日期选择器并回填值
解决方案
核心修改点
- 移除EditText点击事件中直接赋值的错误逻辑,原逻辑会在弹出选择器前直接写入当前日期,无法获取用户选择结果
- 为DatePickerFragment添加日期选择回调,接收用户选中的日期
- 调用Android系统原生日期格式化工具,自动适配设备系统语言区域的显示规则
- 为DatePickerDialog指定Material风格主题,匹配预期弹窗样式
修改后的完整代码
DatePickerActivity.kt
import android.os.Bundle import android.widget.EditText import android.text.format.DateFormat import androidx.appcompat.app.AppCompatActivity import java.util.Calendar class DatePickerActivity : AppCompatActivity() { lateinit var edt: EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_date_picker) edt = findViewById(R.id.edt_birthday) // 禁止EditText弹出输入法,只响应点击事件 edt.inputType = 0 edt.setOnClickListener { showDatePickerDialog() } } private fun showDatePickerDialog() { val datePickerFragment = DatePickerFragment { year, month, day -> // 格式化日期,自动适配系统语言 val selectedCalendar = Calendar.getInstance() selectedCalendar.set(year, month, day) val dateFormatter = DateFormat.getDateFormat(this) edt.setText(dateFormatter.format(selectedCalendar.time)) } datePickerFragment.show(supportFragmentManager, "datePicker") } }
DatePickerFragment.kt
import android.app.DatePickerDialog import android.app.Dialog import android.os.Bundle import android.widget.DatePicker import androidx.fragment.app.DialogFragment import java.util.Calendar class DatePickerFragment(private val onDateSelected: (year: Int, month: Int, day: Int) -> Unit) : DialogFragment(), DatePickerDialog.OnDateSetListener { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val c = Calendar.getInstance() val year = c.get(Calendar.YEAR) val month = c.get(Calendar.MONTH) val day = c.get(Calendar.DAY_OF_MONTH) // 传入系统自带Material主题参数,修改弹窗样式,也可根据需求替换为其他主题 return DatePickerDialog( requireContext(), android.R.style.Theme_Material_Light_Dialog, this, year, month, day ) } override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { // 回调选中的日期给Activity onDateSelected.invoke(year, month, day) } }
补充说明
DateFormat.getDateFormat(context)是Android系统提供的工具类,会自动读取当前设备的语言、区域设置,返回对应格式的日期字符串,无需手动适配多语言场景- 如果需要切换弹窗样式,可以替换
DatePickerDialog的第二个主题参数:- 日历卡片选择样式:可使用
R.style.ThemeOverlay_MaterialComponents_MaterialCalendar - 滚轮选择样式:可使用
R.style.ThemeOverlay_MaterialComponents_DatePicker_Spinner
- 日历卡片选择样式:可使用
- 若使用自定义Material主题需要保证项目依赖了MaterialComponents库,可在模块级
build.gradle中添加依赖:implementation 'com.google.android.material:material:1.9.0'
内容的提问来源于stack exchange,提问作者Yellow Clock
相关产品推荐
相关产品推荐

