Material Date Picker Custom Styling
Solution 1:
About the fullscreen.
The range picker should cover the entire screen (default = dialog for single date, fullscreen for range). However you can change this behavior in your style.
You can use the setTheme
method to apply a theme overlay:
//To apply a dialog
builder.setTheme(R.style.ThemeOverlay_MaterialComponents_MaterialCalendar);
//To apply the fullscreen:
builder.setTheme(R.style.ThemeOverlay_MaterialComponents_MaterialCalendar_Fullscreen);
Note: it requires at least the version 1.2.0-alpha01
.
As alternative you can add in your app theme the materialCalendarFullscreenTheme
attribute.
<stylename="AppTheme"parent="Theme.MaterialComponents.DayNight"><itemname="materialCalendarFullscreenTheme">@style/CustomThemeOverlay_MaterialCalendar_Fullscreen</item></style>
where:
<stylename="CustomThemeOverlay_MaterialCalendar_Fullscreen"parent="@style/ThemeOverlay.MaterialComponents.MaterialCalendar.Fullscreen"><itemname="materialCalendarStyle">@style/Custom_MaterialCalendar.Fullscreen</item></style>
Here you can override the value with the android:windowFullscreen
attribute:
<stylename="Custom_MaterialCalendar.Fullscreen"parent="@style/Widget.MaterialComponents.MaterialCalendar.Fullscreen"><itemname="android:windowFullscreen">false</item></style>
About the strings.
Currently there isn't a method to change the strings.
The only existing method is builder.setTitleText
to change the title.
However you can override all the existing strings in your project, but this workaround can stop to run in the next releases. For example:
<string name="mtrl_picker_save" description="Confirms the selection [CHAR_LIMIT=12]">....</string>
<string name="mtrl_picker_text_input_date_range_start_hint" description="Label for the start date in a range selected by the user [CHAR_LIMIT=60]">...</string>
<string name="mtrl_picker_text_input_date_range_end_hint" description="Label for the end date in a range selected by the user [CHAR_LIMIT=60]">...</string>
Here you can find all the strings used by the material calendar in the 1.2.0-alpha02
.
Solution 2:
Basically, you should play with styles. In your AppTheme add an item materialCalendarTheme
with your custom style that inherits parent ThemeOverlay.MaterialComponents.MaterialCalendar
, and change the style.
- Change text field - call
MaterialDatePicker.Builder
functionsetTitleText()
- Make dialog not full screen - you can't change it for date range picker, the documentation says that it is fullscreen by default
Mobile date range pickers allow selection of a range of dates. They cover the entire screen.
Here's documentation https://material.io/components/pickers
Here's how I tweaked some colors to match my theme:
<stylename="AppTheme"parent="Theme.MaterialComponents.Light"><itemname="materialCalendarTheme">@style/ThemeMaterialCalendar</item></style><stylename="ThemeMaterialCalendar"parent="ThemeOverlay.MaterialComponents.MaterialCalendar"><itemname="buttonBarPositiveButtonStyle">@style/ThemeMaterialCalendarButton</item><itemname="buttonBarNegativeButtonStyle">@style/ThemeMaterialCalendarButton</item><itemname="materialButtonStyle">@style/ThemeMaterialCalendarTextButton</item></style><stylename="ThemeMaterialCalendarButton"parent="Widget.MaterialComponents.Button.TextButton.Dialog"><itemname="android:textColor">?themeTextColorPrimary</item></style><stylename="ThemeMaterialCalendarTextButton"parent="Widget.MaterialComponents.Button.TextButton.Dialog.Flush"><itemname="android:textColor">?themeTextColorPrimary</item><itemname="iconTint">?themeTextColorPrimary</item></style>
Solution 3:
Changing between fullscreen and dialog version can be as easy as that:
fullscreen:
valpicker= MaterialDatePicker.Builder.dateRangePicker().setTheme(R.style.ThemeOverlay_MaterialComponents_MaterialCalendar_Fullscreen).build()
dialog:
valpicker= MaterialDatePicker.Builder.dateRangePicker().setTheme(R.style.ThemeOverlay_MaterialComponents_MaterialCalendar).build()
Solution 4:
While the posted answer totally work there seems to be no need to set the materialCalendarTheme
globally - you can just set it to via the MaterialDatePicker.Builder
and setTheme(int themeResId)
method. Following an example how they do it in the Material Design Catalog App.
val datePicker = MaterialDatePicker.Builder.dateRangePicker().apply {
context?.resolveOrNull(R.attr.materialCalendarTheme)?.let {
setTheme(it)
}
setCalendarConstraints(getConstraints())
}.build()
// ...
resolveOrThrow helper method:
fun Context.resolveOrNull(@AttrRes attributeResId: Int): Int? {
val typedValue = TypedValue()
if (theme.resolveAttribute(attributeResId, typedValue, true)) {
return typedValue.data
}
returnnull
}
This way you DatePicker dialog won't be full screen but a regular dialog.
Post a Comment for "Material Date Picker Custom Styling"