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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:15:04