Der Grund, warum Neils Vorschlag zu einem Vollbild führt, DatePickerist 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 datePickerStyleDinge, die Folgendes definieren: headerBackground(was Sie ändern möchten) dayOfWeekBackgroundund einige andere Textfarben und Textstile.
Das Überschreiben dieses Attributs im Thema Ihrer App funktioniert nicht. DatePickerDialogverwendet ein separates Thema, das vom Attribut zugewiesen werden kann datePickerDialogTheme. Also, für unsere Änderungen zu aktivieren , müssen wir außer Kraft datePickerStyleinnerhalb eines überschriebenendatePickerDialogTheme .
Auf geht's:
Überschreiben datePickerDialogThemeSie 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.Dialogoder sein Theme.Material.Light.Dialog:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Wir haben datePickerStylemit dem Stil überschrieben MyDatePickerStyle. Die Wahl des Elternteils hängt wiederum vom Hauptthema Ihrer App ab: entweder Widget.Material.DatePickeroder 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 headerBackgrounddie 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. colorAccentsteuert die meisten DatePicker'sFarben. Das Überschreiben direkt im colorAccentInneren MyDatePickerDialogThemesollte 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 colorAccentgibt Ihnen den zusätzlichen Vorteil der Änderung OK& CANCELTextfarben auch. Nicht schlecht.
Auf diese Weise müssen Sie dem DatePickerDialog'sKonstruktor 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();