在新的 Material DatePicker 中设置标题颜色

Posted

技术标签:

【中文标题】在新的 Material DatePicker 中设置标题颜色【英文标题】:Setting header colour in the new Material DatePicker 【发布时间】:2016-03-28 12:18:25 【问题描述】:

所以我想改变我的 DatePicker 标题的颜色。不过,这似乎并不像第一次那么容易。您可以像这样在 XML 中执行此操作:

android:headerBackground="@color/myColor" />

但是似乎没有办法在代码中做到这一点。通常的二传手似乎并不明显(即datePicker.setHeaderBackground)。

有什么想法吗?

【问题讨论】:

查看维克拉姆的回答***.com/questions/28738089/… 【参考方案1】:

创建自定义日期选择器对话框。看到这个link 一次。

您可以使用 setAccentColor() 更改此示例中标题的颜色。像dpd.setAccentColor(Color.BLUE); 一样使用它。 如果您不希望按钮使用这种颜色,只需从“DatePickerDialog”类中删除以下行。

okButton.setTextColor(mAccentColor);
cancelButton.setTextColor(mAccentColor);

【讨论】:

【参考方案2】:

这里是更改DatePickerDialog标题背景的方法:

private void setDatePickerHeaderBackgroundColor(DatePickerDialog dpd, int color) 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        try 
            Field mDatePickerField;
            mDatePickerField = DatePickerDialog.class.getDeclaredField("mDatePicker");
            mDatePickerField.setAccessible(true);
            final DatePicker mDatePicker = (DatePicker) mDatePickerField.get(dpd);

            int headerId = Resources.getSystem().getIdentifier("day_picker_selector_layout", "id", "android");
            final View header = mDatePicker.findViewById(headerId);
            header.setBackgroundColor(color);
         catch (NoSuchFieldException e) 
            e.printStackTrace();
         catch (IllegalAccessException e) 
            e.printStackTrace();
        
    

如您所见,我正在使用 Lollipop 及更高版本的 java 反射来获取标题视图。

用法:

    DatePickerDialog dpd = new DatePickerDialog(this, this, 2016, 0, 11);
    setDatePickerHeaderBackgroundColor(dpd, getResources().getColor(android.R.color.black));
    dpd.show();

因此我们有:

编辑:

如果您只想设置在 xml 中创建的 DatePicker 的标题背景,忘记了 java 反射,只需使用这些行使其工作:

     DatePicker mDatePicker = (DatePicker) findViewById(R.id.date_picker);
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
         int headerId = Resources.getSystem().getIdentifier("day_picker_selector_layout", "id", "android");
         final View header = mDatePicker.findViewById(headerId);
         header.setBackgroundColor(getResources().getColor(android.R.color.black));
     

【讨论】:

完美!谢谢你:) 很高兴为您提供帮助。期待你的赏金:)【参考方案3】:

创建这种风格:

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

并将此样式添加到您的对话框主题中:

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

并将此对话框添加到您的应用主题中:

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

这里解释得很清楚:Change Datepicker dialog color for Android 5.0

这确实对我有用。

【讨论】:

【参考方案4】:

您需要覆盖您的DatePickerStyle,按照步骤操作,

1) 在应用的基本主题中覆盖 DatePickerDialogTheme

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

2) 定义CustomDatePickerDialogTheme

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

3) 用 CustomDatePickerStyle 样式覆盖 DatePickerStyle

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

希望对你有帮助。

编辑:很抱歉错过了代码部分, 使用此样式创建 DatePickerDialog 如下:

new DatePickerDialog(getActivity(),R.style.CustomDatePickerStyle, this, year, month, day); 

【讨论】:

以上是关于在新的 Material DatePicker 中设置标题颜色的主要内容,如果未能解决你的问题,请参考以下文章

带有 AppCompat 的 Android Material Design Datepicker

使用 momentjs 更改 Angular Material 中 md-datepicker 的格式

Android Material Design Inline Datepicker问题

如何从日期数组中禁用 Angular Material Datepicker 日期?

在 WPF 中更改 Material Design DatePicker 的外观

在编辑模式下,Material-ui/DatePicker 中未填充日期