方式一:
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()
}
}