Powodem, dla którego sugestia Neila powoduje wyświetlenie pełnego ekranu, DatePickerjest 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 datePickerStyletakie rzeczy, jak: headerBackground(co próbujesz zmienić) dayOfWeekBackgroundoraz kilka innych kolorów i stylów tekstu.
Zastąpienie tego atrybutu w motywie aplikacji nie zadziała. DatePickerDialogużywa osobnego motywu, który można przypisać przez atrybut datePickerDialogTheme. Tak więc, aby nasze zmiany odniosły skutek, musimy nadpisać datePickerStylewewnątrz nadpisaniadatePickerDialogTheme .
No to ruszamy:
Zastąp datePickerDialogThemew 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.Dialogalbo Theme.Material.Light.Dialog:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Unieważniliśmy datePickerStylestylem MyDatePickerStyle. Wybór rodzica będzie ponownie zależał od podstawowego motywu Twojej aplikacji: albo Widget.Material.DatePickeralbo 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, headerBackgroundktó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. colorAccentkontroluje większość DatePicker'skolorów. Zatem nadpisywanie tylko w colorAccentśrodku MyDatePickerDialogThemepowinno 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 colorAccentdaje dodatkową korzyść w postaci zmiany OK& CANCELkoloró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();