Il motivo per cui il suggerimento di Neil si traduce in uno schermo intero DatePickerè la scelta del tema principale:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Inoltre, se segui questa strada, devi specificare il tema durante la creazione di 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();
Questo, secondo me, non va bene. Si dovrebbe cercare di mantenere lo stile fuori da Java e all'interno di styles.xml / themes.xml.
Sono d'accordo sul fatto che il suggerimento di Neil, con un po 'di cambiamento (cambiando il tema principale in dire, Theme.Material.Light.Dialog) ti darà il risultato desiderato. Ma ecco l'altro modo:
A prima vista, ci imbattiamo in datePickerStyleche definisce cose come: headerBackground(cosa stai cercando di cambiare) dayOfWeekBackground, e alcuni altri colori e stili di testo.
L'override di questo attributo nel tema della tua app non funzionerà. DatePickerDialogutilizza un tema separato assegnabile dall'attributo datePickerDialogTheme. Quindi, affinché le nostre modifiche abbiano effetto, dobbiamo eseguire l'override datePickerStyleall'interno di un overridendatePickerDialogTheme .
Eccoci qui:
Sostituisci datePickerDialogThemeall'interno del tema di base della tua app:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Definisci MyDatePickerDialogTheme. La scelta del tema principale dipenderà dal tema di base della tua app: potrebbe essere Theme.Material.Dialogo Theme.Material.Light.Dialog:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Abbiamo sovrascritto datePickerStylecon lo stile MyDatePickerStyle. La scelta del genitore dipenderà ancora una volta dal tema di base della tua app: o Widget.Material.DatePickero Widget.Material.Light.DatePicker. Definiscilo secondo le tue esigenze:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Attualmente, stiamo solo sovrascrivendo quello headerBackgroundche di default è impostato su ?attr/colorAccent(questo è anche il motivo per cui il suggerimento di Neil funziona nel cambiare lo sfondo). Ma c'è molta personalizzazione possibile:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Se non desideri questo controllo (personalizzazione), non è necessario eseguire l'override datePickerStyle. colorAccentcontrolla la maggior parte dei DatePicker'scolori. Quindi, l'override appena colorAccentdentro MyDatePickerDialogThemedovrebbe funzionare:
<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>
Override colorAccentti dà il vantaggio di cambiare OKe CANCELcolori del testo pure. Non male.
In questo modo non è necessario fornire alcuna informazione di stile al DatePickerDialog'scostruttore. Tutto è stato cablato correttamente:
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();