如何更改 Android 5.0 的 DatePicker 对话框颜色
How to change DatePicker dialog color for Android 5.0
是否可以更改 Android 5.0 的日期选择器(以及时间选择器)配色方案?
我试过设置强调色,但这不起作用(有无 android
):
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/purple</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/purple_tint</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<item name="colorAccent">@color/purple_tint</item>
来自原文:
像这样:
试试这个。
代码
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
风格 在你的 styles.xml 文件中
编辑 - 按照建议将主题更改为 Theme.AppCompat.Light.Dialog
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">@color/blue_500</item>
</style>
Neil 的建议导致全屏的原因 DatePicker
是父主题的选择:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
此外,如果你走这条路,你必须在创建时指定主题 DatePickerDialog
:
// R.style.DialogTheme
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
这在我看来并不好。应该尽量将样式保持在 java 之外和内部样式。xml/themes.xml.
我同意 Neil 的建议,稍作改动(将父主题更改为 Theme.Material.Light.Dialog
)即可获得所需的结果。但是,这是另一种方式:
第一次检查时,我们发现 datePickerStyle
定义了诸如 headerBackground
(您要更改的内容)、dayOfWeekBackground
和其他一些文本颜色和文本样式。
在您的应用主题中覆盖此属性将不起作用。 DatePickerDialog
使用可由属性 datePickerDialogTheme
分配的单独主题。因此,为了让我们的更改生效,我们必须 override datePickerStyle
inside overriden datePickerDialogTheme
.
我们开始:
在您应用的基本主题中覆盖 datePickerDialogTheme
:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
定义 MyDatePickerDialogTheme
。父主题的选择将取决于您应用的基本主题:它可以是 Theme.Material.Dialog
或 Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
我们用 MyDatePickerStyle
样式覆盖了 datePickerStyle
。父级的选择将再次取决于您应用的基本主题:Widget.Material.DatePicker
或 Widget.Material.Light.DatePicker
。根据您的要求定义它:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
目前,我们只覆盖默认设置为 ?attr/colorAccent
的 headerBackground
(这也是 Neil 建议在更改背景时起作用的原因)。但是可以进行很多自定义:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
如果您不想要这么多控制(自定义),则不需要重写 datePickerStyle
。 colorAccent
控制大部分 DatePicker's
颜色。因此,仅覆盖 MyDatePickerDialogTheme
中的 colorAccent
应该有效:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:colorAccent">@color/date_picker_accent</item>
<!-- No need to override 'datePickerStyle' -->
<!-- <item name="android:datePickerStyle">@style/MyDatePickerStyle</item> -->
</style>
覆盖 colorAccent
还为您提供了更改 OK
和 CANCEL
文本颜色的额外好处。还不错。
这样您就不必向 DatePickerDialog's
构造函数提供任何样式信息。一切都已正确连接:
DatePickerDialog dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}, 2015, 5, 22);
dpd.show();
顺便提一下,您也可以使用 android.R.style.Theme_DeviceDefault_Light_Dialog
这样的默认主题。
new DatePickerDialog(MainActivity.this, android.R.style.Theme_DeviceDefault_Light_Dialog, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
您没有创建主题,只需将其写在您的对话框创建对象中即可
DatePickerDialog datePicker = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT,this, mYear, mMonth, mDay);
按照此操作,它将为您提供所有类型的日期选择器样式
真的很管用
http://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/
试试这个,对我有用
输入两个选项,colorAccent
和 android:colorAccent
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
....
<item name="android:dialogTheme">@style/AppTheme.DialogTheme</item>
<item name="android:datePickerDialogTheme">@style/Dialog.Theme</item>
</style>
<style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<!-- Put the two options, colorAccent and android:colorAccent. -->
<item name="colorAccent">@color/colorPrimary</item>
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:colorAccent">@color/colorPrimary</item>
</style>
我遇到的问题是 android API 24 的屏幕上没有显示时间选择器按钮。 (API 21+)
它由
解决
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:colorAccent">@color/colorPrimary2</item></style>
<style name="Theme" parent="BBaseTheme">
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
<style name="AppThemeDatePicker" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorAccent">@color/select2</item>
<item name="android:colorAccent">@color/select2</item>
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/select2</item>
</style>
用于更改年份列表项文本颜色(特定于 ANDROID 5.0)
只需在日期选择器对话框样式中设置特定的文本颜色即可。由于某种原因,设置标志 yearListItemTextAppearance
不会反映年份列表的任何变化。
<item name="android:textColor">@android:color/black</item>
创建新样式
<!-- Theme.AppCompat.Light.Dialog -->
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">@color/blue_500</item>
</style>
Java代码:
父主题是这里的关键。
选择你的颜色重点
DatePickerDialog = new DatePickerDialog(context,R.style.DialogTheme,this,now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DAY_OF_MONTH);
结果:
科特林,2021 年
// set date as button text if pressed
btnDate.setOnClickListener(View.OnClickListener {
val dpd = DatePickerDialog(
this,
{ view, year, monthOfYear, dayOfMonth ->
val selectDate = Calendar.getInstance()
selectDate.set(Calendar.YEAR, year)
selectDate.set(Calendar.MONTH, monthOfYear)
selectDate.set(Calendar.DAY_OF_MONTH, dayOfMonth)
var formatDate = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
val date = formatDate.format(selectDate.time)
Toast.makeText(this, date, Toast.LENGTH_SHORT).show()
btnDate.text = date
}, 1990, 6, 6
)
val calendar = Calendar.getInstance()
val year = calendar[Calendar.YEAR]
val month = calendar[Calendar.MONTH]
val day = calendar[Calendar.DAY_OF_MONTH]
dpd.datePicker.minDate = GregorianCalendar(year - 90, month, day, 0, 0).timeInMillis
dpd.datePicker.maxDate = GregorianCalendar(year - 10, month, day, 0, 0).timeInMillis
dpd.show()
})
Styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- This is main Theme Style for your application! -->
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker">
<item name="android:headerBackground">#A500FF</item>
</style>
是否可以更改 Android 5.0 的日期选择器(以及时间选择器)配色方案?
我试过设置强调色,但这不起作用(有无 android
):
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/purple</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/purple_tint</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<item name="colorAccent">@color/purple_tint</item>
来自原文:
像这样:
试试这个。
代码
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
风格 在你的 styles.xml 文件中
编辑 - 按照建议将主题更改为 Theme.AppCompat.Light.Dialog
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">@color/blue_500</item>
</style>
Neil 的建议导致全屏的原因 DatePicker
是父主题的选择:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
此外,如果你走这条路,你必须在创建时指定主题 DatePickerDialog
:
// R.style.DialogTheme
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
这在我看来并不好。应该尽量将样式保持在 java 之外和内部样式。xml/themes.xml.
我同意 Neil 的建议,稍作改动(将父主题更改为 Theme.Material.Light.Dialog
)即可获得所需的结果。但是,这是另一种方式:
第一次检查时,我们发现 datePickerStyle
定义了诸如 headerBackground
(您要更改的内容)、dayOfWeekBackground
和其他一些文本颜色和文本样式。
在您的应用主题中覆盖此属性将不起作用。 DatePickerDialog
使用可由属性 datePickerDialogTheme
分配的单独主题。因此,为了让我们的更改生效,我们必须 override datePickerStyle
inside overriden datePickerDialogTheme
.
我们开始:
在您应用的基本主题中覆盖 datePickerDialogTheme
:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
定义 MyDatePickerDialogTheme
。父主题的选择将取决于您应用的基本主题:它可以是 Theme.Material.Dialog
或 Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
我们用 MyDatePickerStyle
样式覆盖了 datePickerStyle
。父级的选择将再次取决于您应用的基本主题:Widget.Material.DatePicker
或 Widget.Material.Light.DatePicker
。根据您的要求定义它:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
目前,我们只覆盖默认设置为 ?attr/colorAccent
的 headerBackground
(这也是 Neil 建议在更改背景时起作用的原因)。但是可以进行很多自定义:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
如果您不想要这么多控制(自定义),则不需要重写 datePickerStyle
。 colorAccent
控制大部分 DatePicker's
颜色。因此,仅覆盖 MyDatePickerDialogTheme
中的 colorAccent
应该有效:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:colorAccent">@color/date_picker_accent</item>
<!-- No need to override 'datePickerStyle' -->
<!-- <item name="android:datePickerStyle">@style/MyDatePickerStyle</item> -->
</style>
覆盖 colorAccent
还为您提供了更改 OK
和 CANCEL
文本颜色的额外好处。还不错。
这样您就不必向 DatePickerDialog's
构造函数提供任何样式信息。一切都已正确连接:
DatePickerDialog dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}, 2015, 5, 22);
dpd.show();
顺便提一下,您也可以使用 android.R.style.Theme_DeviceDefault_Light_Dialog
这样的默认主题。
new DatePickerDialog(MainActivity.this, android.R.style.Theme_DeviceDefault_Light_Dialog, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
}
}, 2015, 02, 26).show();
您没有创建主题,只需将其写在您的对话框创建对象中即可
DatePickerDialog datePicker = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT,this, mYear, mMonth, mDay);
按照此操作,它将为您提供所有类型的日期选择器样式 真的很管用
http://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/
试试这个,对我有用
输入两个选项,colorAccent
和 android:colorAccent
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
....
<item name="android:dialogTheme">@style/AppTheme.DialogTheme</item>
<item name="android:datePickerDialogTheme">@style/Dialog.Theme</item>
</style>
<style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<!-- Put the two options, colorAccent and android:colorAccent. -->
<item name="colorAccent">@color/colorPrimary</item>
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:colorAccent">@color/colorPrimary</item>
</style>
我遇到的问题是 android API 24 的屏幕上没有显示时间选择器按钮。 (API 21+) 它由
解决<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:colorAccent">@color/colorPrimary2</item></style>
<style name="Theme" parent="BBaseTheme">
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
<style name="AppThemeDatePicker" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorAccent">@color/select2</item>
<item name="android:colorAccent">@color/select2</item>
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/select2</item>
</style>
用于更改年份列表项文本颜色(特定于 ANDROID 5.0)
只需在日期选择器对话框样式中设置特定的文本颜色即可。由于某种原因,设置标志 yearListItemTextAppearance
不会反映年份列表的任何变化。
<item name="android:textColor">@android:color/black</item>
创建新样式
<!-- Theme.AppCompat.Light.Dialog -->
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">@color/blue_500</item>
</style>
Java代码:
父主题是这里的关键。 选择你的颜色重点
DatePickerDialog = new DatePickerDialog(context,R.style.DialogTheme,this,now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DAY_OF_MONTH);
结果:
科特林,2021 年
// set date as button text if pressed
btnDate.setOnClickListener(View.OnClickListener {
val dpd = DatePickerDialog(
this,
{ view, year, monthOfYear, dayOfMonth ->
val selectDate = Calendar.getInstance()
selectDate.set(Calendar.YEAR, year)
selectDate.set(Calendar.MONTH, monthOfYear)
selectDate.set(Calendar.DAY_OF_MONTH, dayOfMonth)
var formatDate = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
val date = formatDate.format(selectDate.time)
Toast.makeText(this, date, Toast.LENGTH_SHORT).show()
btnDate.text = date
}, 1990, 6, 6
)
val calendar = Calendar.getInstance()
val year = calendar[Calendar.YEAR]
val month = calendar[Calendar.MONTH]
val day = calendar[Calendar.DAY_OF_MONTH]
dpd.datePicker.minDate = GregorianCalendar(year - 90, month, day, 0, 0).timeInMillis
dpd.datePicker.maxDate = GregorianCalendar(year - 10, month, day, 0, 0).timeInMillis
dpd.show()
})
Styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- This is main Theme Style for your application! -->
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker">
<item name="android:headerBackground">#A500FF</item>
</style>