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 datePickerStyle
che 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à. DatePickerDialog
utilizza un tema separato assegnabile dall'attributo datePickerDialogTheme
. Quindi, affinché le nostre modifiche abbiano effetto, dobbiamo eseguire l'override datePickerStyle
all'interno di un overridendatePickerDialogTheme
.
Eccoci qui:
Sostituisci datePickerDialogTheme
all'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.Dialog
o Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Abbiamo sovrascritto datePickerStyle
con lo stile MyDatePickerStyle
. La scelta del genitore dipenderà ancora una volta dal tema di base della tua app: o Widget.Material.DatePicker
o 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 headerBackground
che 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
. colorAccent
controlla la maggior parte dei DatePicker's
colori. Quindi, l'override appena colorAccent
dentro MyDatePickerDialogTheme
dovrebbe 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 colorAccent
ti dà il vantaggio di cambiare OK
e CANCEL
colori del testo pure. Non male.
In questo modo non è necessario fornire alcuna informazione di stile al DatePickerDialog's
costruttore. 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();