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()
    }
}
相关推荐
成都大菠萝4 小时前
Android Car CarProperty 车辆信号链路
android
敲代码的鱼5 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹6 小时前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
Coffeeee10 小时前
闲聊几句,Android老哥们,你们多久没做技改需求了
android·程序员·代码规范
萝卜er11 小时前
Fragment 生命周期与状态恢复-《Android深水区(四)》
android
萝卜er11 小时前
Intent 显式、隐式与 PendingIntent-《Android深水区(五)》
android
Kapaseker13 小时前
一文吃透 Kotlin 集合操作符
android·kotlin
三少爷的鞋15 小时前
Main-safe:现代Android 架构真正的分水岭
android
沐怡旸1 天前
深入解析 Android Performance Analyzer (APA) 底层架构与技术原理
android
李斯维1 天前
从历史的角度看 Android 软件架构
android·架构·android jetpack