Powodem, dla którego sugestia Neila powoduje wyświetlenie pełnego ekranu, DatePicker
jest wybór motywu macierzystego:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Ponadto, jeśli wybierzesz tę trasę, musisz określić motyw podczas tworzenia 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();
Moim zdaniem to nie jest dobre. Należy starać się unikać stylizacji z javy i wewnątrz styles.xml / themes.xml.
Zgadzam się, że sugestia Neila, z niewielką zmianą (zmiana motywu nadrzędnego, aby powiedzieć, Theme.Material.Light.Dialog
) przyniesie pożądany rezultat. Ale oto inny sposób:
Przy pierwszej inspekcji natrafiamy na datePickerStyle
takie rzeczy, jak: headerBackground
(co próbujesz zmienić) dayOfWeekBackground
oraz kilka innych kolorów i stylów tekstu.
Zastąpienie tego atrybutu w motywie aplikacji nie zadziała. DatePickerDialog
używa osobnego motywu, który można przypisać przez atrybut datePickerDialogTheme
. Tak więc, aby nasze zmiany odniosły skutek, musimy nadpisać datePickerStyle
wewnątrz nadpisaniadatePickerDialogTheme
.
No to ruszamy:
Zastąp datePickerDialogTheme
w motywie podstawowym aplikacji:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Zdefiniuj MyDatePickerDialogTheme
. Wybór macierzystego tematem będzie zależeć od tego, co baza motyw z aplikacji jest: może to być Theme.Material.Dialog
albo Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Unieważniliśmy datePickerStyle
stylem MyDatePickerStyle
. Wybór rodzica będzie ponownie zależał od podstawowego motywu Twojej aplikacji: albo Widget.Material.DatePicker
albo Widget.Material.Light.DatePicker
. Zdefiniuj to zgodnie ze swoimi wymaganiami:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Obecnie nadpisujemy tylko to, headerBackground
które jest domyślnie ustawione na ?attr/colorAccent
(dlatego też sugestia Neila działa przy zmianie tła). Ale istnieje wiele możliwości dostosowania:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Jeśli nie chcesz takiej kontroli (dostosowywania), nie musisz nadpisywać datePickerStyle
. colorAccent
kontroluje większość DatePicker's
kolorów. Zatem nadpisywanie tylko w colorAccent
środku MyDatePickerDialogTheme
powinno działać:
<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>
Zastępowanie colorAccent
daje dodatkową korzyść w postaci zmiany OK
& CANCEL
kolorów tekstu. Nie jest zły.
W ten sposób nie musisz podawać konstruktorowi żadnych informacji o stylizacji DatePickerDialog's
. Wszystko zostało prawidłowo okablowane:
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();