La raison pour laquelle la suggestion de Neil aboutit à un plein écran DatePicker
est 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 datePickerStyle
qui 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. DatePickerDialog
utilise un thème distinct assignable par l'attribut datePickerDialogTheme
. Donc, pour que nos modifications prennent effet, nous devons remplacer à l' datePickerStyle
intérieur d'un remplacementdatePickerDialogTheme
.
Et c'est parti:
Remplacez datePickerDialogTheme
le 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.Dialog
ou 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é datePickerStyle
le style MyDatePickerStyle
. Le choix du parent dépendra encore une fois du thème de base de votre application: soit Widget.Material.DatePicker
ou 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 headerBackground
ce 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
. colorAccent
contrôle la plupart des DatePicker's
couleurs. Donc, le remplacement juste à l' colorAccent
intérieur MyDatePickerDialogTheme
devrait 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 colorAccent
vous donne l'avantage de changer OK
et les CANCEL
couleurs du texte aussi bien. Pas mal.
De cette façon, vous n'avez pas à fournir d'informations de style au DatePickerDialog's
constructeur. 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();