如何更改Android 5.0的DatePicker对话框颜色


111

是否可以更改android 5.0的datepicker(以及timepicker)配色方案?

我尝试设置重点色,但这不起作用(带和不带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>

从原始: 在此处输入图片说明

对于这样的事情: 在此处输入图片说明


应用主题样式中您要设置的颜色重点是什么颜色
Neil

@Neil到目前为止,我已经添加了我尝试用于样式化的代码。
Warpzit 2015年

Answers:


321

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之外,并放在styles.xml / themes.xml中。

我同意Neil的建议(稍有更改(将父主题更改为Theme.Material.Light.Dialog))将为您带来预期的结果。但是,这是另一种方式:

第一次检查时,我们发现datePickerStyle其中定义了以下内容:(headerBackground您要更改的内容)dayOfWeekBackground,和其他一些文本颜色和文本样式。

无法在您的应用主题中覆盖此属性。DatePickerDialog使用可通过属性分配的单独主题datePickerDialogTheme。因此,对于我们的更改生效,就必须重写datePickerStyle一个被覆盖的内部datePickerDialogTheme

开始了:

覆盖datePickerDialogTheme您应用的基本主题:

<style name="AppBaseTheme" parent="android:Theme.Material.Light">
    ....
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

定义MyDatePickerDialogTheme。父主题的选择取决于您应用的基本主题:可以是Theme.Material.DialogTheme.Material.Light.Dialog

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

我们已经取代datePickerStyle了样式MyDatePickerStyle。父级的选择将再次取决于您应用的基本主题:Widget.Material.DatePickerWidget.Material.Light.DatePicker。根据您的要求进行定义:

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>

当前,我们仅覆盖headerBackground默认设置为的值?attr/colorAccent(这也是Neil建议在更改背景时起作用的原因)。但是有很多定制可能:

dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor

如果您不需要太多控制(自定义),则无需覆盖datePickerStylecolorAccent控制大多数DatePicker's颜色。因此,覆盖colorAccent内部MyDatePickerDialogTheme应该可以工作:

<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为您带来了更改OKCANCEL文本颜色的额外好处。不错。

这样,您不必向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();

8
感谢您的好和它是如何工作充分说明,以及如何不得不在风格被重写
Warpzit

极好的解释@Vikram我们如何更改确定,取消文本颜色?
Dilip

1
找不到@Vikram calendarSelectedTextColor。
Akhilesh Dhar Dubey

7
是否可能向后兼容android <21 datePicker?
RoCk RoCk's

1
@RoCk不确定您的意思,但是我建立了一个库来将日期和时间选择器从android 23版本移植到14版本。该项目托管在:https : //github.com/vikramkakkar/SublimePicker
维克拉姆

68

试试看。

代码

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>

2
是的,它是紫色的,但也是全屏的:),但是如果我将它放在一个片段中,它将被包含在内。在我再次尝试之前有什么建议吗?
Warpzit 2015年

我将看看是否能找到一种不会导致其全屏显示的更合适的解决方案
Neil

9
只需使用 parent="Theme.AppCompat.Light.Dialog"的不是parent="Theme.AppCompat.Light"
Chupik

@Neil感谢您的回答,为我指出了正确的方向,这无疑是最快的解决方案,但我一直在寻找一种所有样式/主题的方法:)
Warpzit 2015年

无法在android 6上运行,它是全屏模式,并且颜色没有更改
Jemshit Iskenderov

16

创造新风格

<!-- 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);

结果:

在此处输入图片说明


6

试试这个,为我工作

放入两个选项,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>

此答案不需要v24 API和更高版本的💪–
迈克尔

3

只需提一下,您也可以使用默认的主题,例如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();

1

您没有创建主题,只需将其写入对话框创建对象

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/


像宝石,兄弟!
山姆

AlertDialog.THEME_HOLO_LIGHT弃用..不工作
佳日

1
<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>

0

我遇到的问题是,在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>

0

用于更改年份列表项的文本颜色(ANDROID 5.0专用)

只需在日期选择器对话框样式中设置某些文本颜色即可。出于某些原因,设置标志yearListItemTextAppearance不会反映年份列表中的任何更改。

<item name="android:textColor">@android:color/black</item>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.