Der Grund, warum Neils Vorschlag zu einem Vollbild führt, DatePicker
ist die Wahl des übergeordneten Themas:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Wenn Sie diesen Weg gehen, müssen Sie außerdem das Thema angeben, während Sie Folgendes erstellen 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();
Das ist meiner Meinung nach nicht gut. Man sollte versuchen, das Styling von Java und innerhalb von styles.xml / theme.xml fernzuhalten.
Ich bin damit einverstanden, dass Neils Vorschlag mit ein wenig Änderung (Änderung des übergeordneten Themas Theme.Material.Light.Dialog
) das gewünschte Ergebnis bringt. Aber hier ist der andere Weg:
Bei der ersten Betrachtung stoßen wir auf datePickerStyle
Dinge, die Folgendes definieren: headerBackground
(was Sie ändern möchten) dayOfWeekBackground
und einige andere Textfarben und Textstile.
Das Überschreiben dieses Attributs im Thema Ihrer App funktioniert nicht. DatePickerDialog
verwendet ein separates Thema, das vom Attribut zugewiesen werden kann datePickerDialogTheme
. Also, für unsere Änderungen zu aktivieren , müssen wir außer Kraft datePickerStyle
innerhalb eines überschriebenendatePickerDialogTheme
.
Auf geht's:
Überschreiben datePickerDialogTheme
Sie das Basisthema Ihrer App:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Definieren MyDatePickerDialogTheme
. Die Auswahl des übergeordneten Themas hängt vom Basisthema Ihrer App ab: Es kann entweder Theme.Material.Dialog
oder sein Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Wir haben datePickerStyle
mit dem Stil überschrieben MyDatePickerStyle
. Die Wahl des Elternteils hängt wiederum vom Hauptthema Ihrer App ab: entweder Widget.Material.DatePicker
oder Widget.Material.Light.DatePicker
. Definieren Sie es gemäß Ihren Anforderungen:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Derzeit überschreiben wir nur headerBackground
die Standardeinstellung ?attr/colorAccent
(aus diesem Grund funktioniert der Neil-Vorschlag auch beim Ändern des Hintergrunds). Es sind jedoch viele Anpassungen möglich:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Wenn Sie nicht so viel Kontrolle (Anpassung) wünschen, müssen Sie nicht überschreiben datePickerStyle
. colorAccent
steuert die meisten DatePicker's
Farben. Das Überschreiben direkt im colorAccent
Inneren MyDatePickerDialogTheme
sollte also funktionieren:
<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>
Aufschalten colorAccent
gibt Ihnen den zusätzlichen Vorteil der Änderung OK
& CANCEL
Textfarben auch. Nicht schlecht.
Auf diese Weise müssen Sie dem DatePickerDialog's
Konstruktor keine Styling-Informationen bereitstellen . Alles wurde richtig verkabelt:
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();