Android中自定义日期选择器样式DatePickerDialog

方式一:

res文件下value文件下style.xml

XML 复制代码
<style name="CustomDatePickerTheme" parent="Theme.MaterialComponents.Light.Dialog">
        <!-- 1. 标题栏背景色 -->
        <item name="colorPrimary">你的颜色</item>
        <!-- 2. 标题文字颜色 -->
        <item name="colorOnPrimary">你的颜色</item>
        <!-- 3. 按钮文字颜色(确定/取消) -->
        <item name="colorAccent">你的颜色</item>
        <!-- 4. 选中日期的颜色 -->
        <item name="android:colorControlActivated">你的颜色</item>
        <!-- 5. 对话框背景色 -->
        <item name="android:windowBackground">你的颜色</item>
    </style>
Kotlin 复制代码
//年月日选择器:R.style.CustomDatePickerTheme指定的样式
class MyDatePickerDialog(context: Context,
                         listener: OnDateSetListener?,
                         year: Int,
                         monthOfYear: Int,
                         dayOfMonth: Int
) : DatePickerDialog(context, R.style.CustomDatePickerTheme, listener, year, monthOfYear, dayOfMonth) {
    override fun onStart() {
        super.onStart()
		//确定按钮
        getButton(BUTTON_POSITIVE)?.setTextColor(ContextCompat.getColor(context, R.color.login_title))
		//取消按钮
        getButton(BUTTON_NEGATIVE)?.setTextColor(ContextCompat.getColor(context, R.color.login_title))
    }
}
Kotlin 复制代码
//时分秒选择器
class MyTimePickerDialog(context: Context?,
                         listener: OnTimeSetListener?,
                         hourOfDay: Int,
                         minute: Int,
                         is24HourView: Boolean
): TimePickerDialog(context, R.style.CustomDatePickerTheme, listener,hourOfDay,minute,is24HourView) {
    override fun onStart() {
        super.onStart()
        getButton(BUTTON_POSITIVE)?.setTextColor(ContextCompat.getColor(context, R.color.login_title))
        getButton(BUTTON_NEGATIVE)?.setTextColor(ContextCompat.getColor(context, R.color.login_title))
    }
}

使用:

Kotlin 复制代码
public class Test{

    private var calendar = Calendar.getInstance()
	private fun showDateTimePicker(editText: EditText) {
        // 显示日期选择器
        val datePickerDialog = MyDatePickerDialog(
            requireContext(),
            { _, year, monthOfYear, dayOfMonth ->
                calendar.set(Calendar.YEAR, year)
                calendar.set(Calendar.MONTH, monthOfYear)
                calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)

                // 显示时间选择器
                showTimePicker(editText)
            },
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
        )
        datePickerDialog.show()
    }
	private fun showTimePicker(editText: EditText) {
        // 显示时间选择器
        val timePickerDialog = MyTimePickerDialog(
            requireContext(),
            { _, hourOfDay, minute ->
                calendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
                calendar.set(Calendar.MINUTE, minute)

                // 如果需要选择秒数,可以手动添加一个输入框或其他方式让用户输入秒数
                // 这里我们假设用户不需要选择秒数或默认为00
                calendar.set(Calendar.SECOND, 0)

                updateDateTimeText(editText)
            },
            calendar.get(Calendar.HOUR_OF_DAY),
            calendar.get(Calendar.MINUTE),
            true
        ) // 使用24小时制
        timePickerDialog.show()
    }
	private fun updateDateTimeText(editText: EditText) {
        // 更新TextView以显示所选的完整日期和时间
        val month = calendar.get(Calendar.MONTH) + 1
        val formattedMonth = String.format("%02d", month)
        val day = calendar.get(Calendar.DAY_OF_MONTH)
        val formattedDay = String.format("%02d", day)
        val selectedDateTime =
            "${calendar.get(Calendar.YEAR)}-$formattedMonth-$formattedDay " +
                    "${calendar.get(Calendar.HOUR_OF_DAY)}:${calendar.get(Calendar.MINUTE)}:00"//${calendar.get(Calendar.SECOND)}
        editText.setText(selectedDateTime)
    }
}

方式二:

res文件下value文件下style.xml

XML 复制代码
<!-- 自定义 DatePickerDialog 主题 -->
    <style name="CustomDatePickerDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
        <item name="colorAccent">你的颜色</item> 
        <item name="colorControlActivated">你的颜色</item>
		<!-- 确定/取消按钮颜色 -->
        <item name="buttonBarPositiveButtonStyle">@style/DatePickerButtonStyle</item>
        <item name="buttonBarNegativeButtonStyle">@style/DatePickerButtonStyle</item>
        <item name="buttonBarNeutralButtonStyle">@style/DatePickerButtonStyle</item>
    </style>
    <style name="DatePickerButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
        <item name="android:textColor">你的颜色</item>
        <!-- 可选:修改按钮背景、字体等 -->
        <!-- <item name="android:background">...</item> -->
    </style>

使用:

Kotlin 复制代码
public class Test{
	private fun showDateTimePicker(editText: EditText) {
        // 显示日期选择器
        val datePickerDialog = DatePickerDialog(
            requireContext(),R.style.CustomDatePickerDialogTheme,
            { _, year, monthOfYear, dayOfMonth ->
                calendar.set(Calendar.YEAR, year)
                calendar.set(Calendar.MONTH, monthOfYear)
                calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)

                // 显示时间选择器
                showTimePicker(editText)
            },
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
        )
        datePickerDialog.show()
    }
}
相关推荐
lxysbly19 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者81 天前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20351 天前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥1 天前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓1 天前
[JDBC]元数据
android
独行soc1 天前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能1 天前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿1 天前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc1 天前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20351 天前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos