如何设计Android MaterialCalendar各种组件的样式

如何设计Android MaterialCalendar各种组件的样式,android,android-styles,android-datepicker,material-components-android,Android,Android Styles,Android Datepicker,Material Components Android,我正在尝试设计此材质日历,但我没有任何进展,希望您能提供帮助。 我的styles.xml看起来类似于以下内容: <style name="AppTheme" parent="Theme.MaterialComponents"> <item name="materialCalendarTheme">@style/ThemeMaterialCalendar</item> </style> <style name="ThemeMater

我正在尝试设计此
材质日历
,但我没有任何进展,希望您能提供帮助。 我的
styles.xml
看起来类似于以下内容:

 <style name="AppTheme" parent="Theme.MaterialComponents">
    <item name="materialCalendarTheme">@style/ThemeMaterialCalendar</item>
</style>

<style name="ThemeMaterialCalendar" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
    <item name="buttonBarPositiveButtonStyle">@style/AlterDialogButtonStyle</item>
    <item name="buttonBarNegativeButtonStyle">@style/AlterDialogButtonStyle</item>
    <item name="materialButtonStyle">@style/ThemeMaterialCalendarTextButton</item>
    <item name="android:colorAccent">@color/accent</item>
</style>

<style name="ThemeMaterialCalendarTextButton" parent="Widget.MaterialComponents.Button.TextButton.Dialog.Flush">
    <item name="android:textColor">?attr/colorAccent</item>
</style>

<style name="AlterDialogButtonStyle" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">?attr/colorAccent</item>
</style>

@样式/主题材料日历
@样式/可选对话框按钮样式
@样式/可选对话框按钮样式
@样式/主题材质CalendarTextButton
@颜色/口音
?属性/颜色重音
?属性/颜色重音
它呈现出类似于:

非常浅的蓝色/青色是我的
colorAccent
标题是紫色-y色。那些很好。我可以用上面的
style.xml
更改它们

不过,我还想将
MaterialCalendar
的深灰色背景更改为白色,然后当然将文本从白色更改为黑色或灰色(以便可以看到),并为月份和年份选择设置箭头。任何选定的年份或日期都应使用强调色突出显示

本质上,我想要类似的东西(请忽略以下事实,即下面的屏幕截图是旧的
DatePickerDialog
,而不是新的
MaterialCalendar
):

任何帮助都将不胜感激


备注:我不想更改整个应用程序的任何主色、副色或强调色(因为这会破坏颜色方案的其余部分)

MaterialDatePicker
中自定义颜色的最佳方法是覆盖它们:

<style name="MaterialCalendarThemeBackground" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
    <item name="colorSurface">@color/....</item>
    <item name="colorOnSurface">@color/....</item>
    <item name="colorPrimary">@color/....</item>      
    <item name="colorOnPrimary">@color/....</item>
</style>

相反,如果要使用自定义样式更改其他颜色,可以执行以下操作:

  • :它基于
    颜色表面
    。您可以定义:
与:


...
...

扩展到@Gabriele Mariotti为那些未来想要定制MaterialDatePicker的人提供答案

(旁注):我注意到平板电脑上的MaterialDatePicker恢复为默认颜色,我不知道为什么会这样

MaterialDatePicker大小可以通过使用此行从全屏更改为对话框大小

<item name="android:windowFullscreen">false</item>
如果你不确定的话,我会建议你尝试一下这些样式,并对颜色进行修改,看看它们到底会发生什么变化

<style name="AppTheme"  parent="Theme.MaterialComponents.Light">
   <item name="materialCalendarFullscreenTheme">@styleCustomThemeOverlay_MaterialCalendar_Fullscreen</item>
    </style>

    <style name="CustomThemeOverlay_MaterialCalendar_Fullscreen" parent="@style/ThemeOverlay.MaterialComponents.MaterialCalendar">
        <item name="materialCalendarStyle">@style/Custom_MaterialCalendar.Fullscreen</item>
        <item name="materialCalendarHeaderTitle">@style/customHeaderTitle</item>
        <item name="materialCalendarHeaderSelection">@style/CustomHeaderSelection</item>
        <item name="buttonBarPositiveButtonStyle">@style/Buttons</item>
        <item name="buttonBarNegativeButtonStyle">@style/Buttons</item>
        <item name="android:textColorPrimary">@color/...</item>
        <item name="colorPrimary">@color/...</item>
        <item name="colorSurface">@color/...</item>
        <item name="colorOnSurface">@color/...</item>
        <item name="colorOnPrimary">@color/...</item>
    </style>


    <style name="Custom_MaterialCalendar.Fullscreen" parent="@style/Widget.MaterialComponents.MaterialCalendar">
        <item name="android:windowFullscreen">false</item>
        <item name="rangeFillColor">@color/...</item>
        <item name="dayStyle">@style/CustomWidget_Day</item>
        <item name="daySelectedStyle">@style/CustomSelected</item>
    </style>
    <style name="customHeaderTitle" parent="@style/Widget.MaterialComponents.MaterialCalendar.HeaderTitle">
        <item name="android:textSize">24sp</item>
        <item name="android:textColor">@color/...</item>
        <item name="colorSurface">@color/...</item>
    </style>
    <style name="CustomHeaderSelection" parent="Widget.MaterialComponents.MaterialCalendar.HeaderSelection">
        <item name="android:textSize">18sp</item>
        <item name="android:textColor">@color/...</item>
    </style>
    <style name="CustomWidget_Day" parent="Widget.MaterialComponents.MaterialCalendar.Day">
        <item name="android:textSize">18sp</item>
        <item name="itemTextColor">@color/...</item>
    </style>
    <style name= "CustomSelected" parent="Widget.MaterialComponents.MaterialCalendar.Day.Selected">
        <item name="itemFillColor">@color/...</item>
        <item name="itemStrokeColor">@color/...</item>
    </style>
    <style name="Buttons" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="android:textColor">@color/...</item>
    </style>

@StyleCustomThemeoOverlay\u MaterialCalendar\u全屏显示
@样式/自定义\材料Calendar.Fullscreen
@样式/定制标题
@风格/客户领导选择
@样式/按钮
@样式/按钮
@颜色/。。。
@颜色/。。。
@颜色/。。。
@颜色/。。。
@颜色/。。。
假的
@颜色/。。。
@样式/自定义日期
@选择样式/自定义
24便士
@颜色/。。。
@颜色/。。。
18便士
@颜色/。。。
18便士
@颜色/。。。
@颜色/。。。
@颜色/。。。
@颜色/。。。
我可以使用以下代码:

    <style name="MaterialCalendarThemeBackground" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
        <item name="materialCalendarStyle">@style/CustomMaterialCalendar</item>
    </style>
<style name="CustomMaterialCalendar" parent="Widget.MaterialComponents.MaterialCalendar">
    <item name="dayStyle">@style/CustomWidget_Day</item>
</style>

<style name="CustomWidget_Day" parent="Widget.MaterialComponents.MaterialCalendar.Day">
    <item name="itemTextColor">@color/...</item>
    <item name="itemStrokeColor">@color/....</item>
</style>
    <style name="CustomMaterialCalendar" parent="Widget.MaterialComponents.MaterialCalendar">
       <item name="daySelectedStyle">@style/CustomSelected</item>
    </style>
  <style name= "CustomSelected" parent="Widget.MaterialComponents.MaterialCalendar.Day.Selected">
    <item name="itemFillColor">...</item>
    <item name="itemTextColor">...</item>
  </style>
<item name="android:windowFullscreen">false</item>
builder.setTheme(R.style.CustomThemeOverlay_MaterialCalendar_Fullscreen);
<style name="AppTheme"  parent="Theme.MaterialComponents.Light">
   <item name="materialCalendarFullscreenTheme">@styleCustomThemeOverlay_MaterialCalendar_Fullscreen</item>
    </style>

    <style name="CustomThemeOverlay_MaterialCalendar_Fullscreen" parent="@style/ThemeOverlay.MaterialComponents.MaterialCalendar">
        <item name="materialCalendarStyle">@style/Custom_MaterialCalendar.Fullscreen</item>
        <item name="materialCalendarHeaderTitle">@style/customHeaderTitle</item>
        <item name="materialCalendarHeaderSelection">@style/CustomHeaderSelection</item>
        <item name="buttonBarPositiveButtonStyle">@style/Buttons</item>
        <item name="buttonBarNegativeButtonStyle">@style/Buttons</item>
        <item name="android:textColorPrimary">@color/...</item>
        <item name="colorPrimary">@color/...</item>
        <item name="colorSurface">@color/...</item>
        <item name="colorOnSurface">@color/...</item>
        <item name="colorOnPrimary">@color/...</item>
    </style>


    <style name="Custom_MaterialCalendar.Fullscreen" parent="@style/Widget.MaterialComponents.MaterialCalendar">
        <item name="android:windowFullscreen">false</item>
        <item name="rangeFillColor">@color/...</item>
        <item name="dayStyle">@style/CustomWidget_Day</item>
        <item name="daySelectedStyle">@style/CustomSelected</item>
    </style>
    <style name="customHeaderTitle" parent="@style/Widget.MaterialComponents.MaterialCalendar.HeaderTitle">
        <item name="android:textSize">24sp</item>
        <item name="android:textColor">@color/...</item>
        <item name="colorSurface">@color/...</item>
    </style>
    <style name="CustomHeaderSelection" parent="Widget.MaterialComponents.MaterialCalendar.HeaderSelection">
        <item name="android:textSize">18sp</item>
        <item name="android:textColor">@color/...</item>
    </style>
    <style name="CustomWidget_Day" parent="Widget.MaterialComponents.MaterialCalendar.Day">
        <item name="android:textSize">18sp</item>
        <item name="itemTextColor">@color/...</item>
    </style>
    <style name= "CustomSelected" parent="Widget.MaterialComponents.MaterialCalendar.Day.Selected">
        <item name="itemFillColor">@color/...</item>
        <item name="itemStrokeColor">@color/...</item>
    </style>
    <style name="Buttons" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="android:textColor">@color/...</item>
    </style>