La raison pour laquelle la suggestion de Neil aboutit à un plein écran DatePickerest le choix du thème parent:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
De plus, si vous suivez cette voie, vous devez spécifier le thème lors de la création du 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();
Cela, à mon avis, n'est pas bon. On devrait essayer de garder le style hors de java et dans styles.xml / themes.xml.
Je suis d'accord que la suggestion de Neil, avec un peu de changement (changer le thème parent pour dire, Theme.Material.Light.Dialog) vous donnera le résultat souhaité. Mais voici l'autre manière:
Lors de la première inspection, nous trouvons datePickerStylequi définit des choses telles que: headerBackground(ce que vous essayez de changer) dayOfWeekBackground, et quelques autres couleurs de texte et styles de texte.
Le remplacement de cet attribut dans le thème de votre application ne fonctionnera pas. DatePickerDialogutilise un thème distinct assignable par l'attribut datePickerDialogTheme. Donc, pour que nos modifications prennent effet, nous devons remplacer à l' datePickerStyleintérieur d'un remplacementdatePickerDialogTheme .
Et c'est parti:
Remplacez datePickerDialogThemele thème de base de votre application:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Définissez MyDatePickerDialogTheme. Le choix du thème parent dépendra du thème de base de votre application: il peut s'agir de l'un Theme.Material.Dialogou l' autre Theme.Material.Light.Dialog:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Nous avons remplacé datePickerStylele style MyDatePickerStyle. Le choix du parent dépendra encore une fois du thème de base de votre application: soit Widget.Material.DatePickerou Widget.Material.Light.DatePicker. Définissez-le selon vos besoins:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Actuellement, nous ne remplaçons que headerBackgroundce qui est défini par défaut ?attr/colorAccent(c'est aussi pourquoi la suggestion de Neil fonctionne pour changer l'arrière-plan). Mais il y a pas mal de personnalisation possible:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Si vous ne voulez pas autant de contrôle (personnalisation), vous n'avez pas besoin de remplacer datePickerStyle. colorAccentcontrôle la plupart des DatePicker'scouleurs. Donc, le remplacement juste à l' colorAccentintérieur MyDatePickerDialogThemedevrait fonctionner:
<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>
Redéfinition colorAccentvous donne l'avantage de changer OKet les CANCELcouleurs du texte aussi bien. Pas mal.
De cette façon, vous n'avez pas à fournir d'informations de style au DatePickerDialog'sconstructeur. Tout a été correctement câblé:
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();