Причина, через яку пропозиція Ніла призводить до повноекранного екрану, DatePicker
- це вибір батьківської теми:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Крім того, якщо ви йдете цим маршрутом, вам потрібно вказати тему, створюючи 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();
Це, на мій погляд, не добре. Слід намагатися утримати стилізацію поза Java та всередині стилів.xml / themes.xml.
Я погоджуюся, що пропозиція Ніла, трохи змінившись (змінивши батьківську тему, щоб сказати: Theme.Material.Light.Dialog
), отримає бажаний результат. Але ось інший спосіб:
При першому огляді ми стикаємося з такими, datePickerStyle
що визначають такі речі, як: headerBackground
(що ви намагаєтесь змінити) dayOfWeekBackground
, та кілька інших кольорів тексту та стилів тексту.
Перезапис цього атрибуту в темі додатка не працюватиме. DatePickerDialog
використовує окрему тему, призначену атрибутом datePickerDialogTheme
. Отже, щоб наші зміни вплинули, ми повинні переотримати datePickerStyle
всередині переоцінкиdatePickerDialogTheme
.
Ось і ми:
Переозначення datePickerDialogTheme
основної теми програми:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Визначте MyDatePickerDialogTheme
. Вибір батьківської теми залежатиме від основної теми вашого додатка: це може бути Theme.Material.Dialog
або Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Ми перекреслили datePickerStyle
стиль MyDatePickerStyle
. Вибір батьків ще раз залежатиме від основної теми вашого додатка: Widget.Material.DatePicker
або Widget.Material.Light.DatePicker
. Визначте це відповідно до своїх вимог:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Наразі ми лише переосмислюємо значення, headerBackground
яке за замовчуванням встановлено ?attr/colorAccent
(саме тому пропозиція Ніла працює у зміні фону). Але можливе налаштування:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Якщо ви не хочете такого великого контролю (налаштування), вам не потрібно перевизначати datePickerStyle
. colorAccent
контролює більшість DatePicker's
кольорів. Отже, переосмислення лише colorAccent
всередині MyDatePickerDialogTheme
повинно працювати:
<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>
Переосмислення colorAccent
дає вам додаткову перевагу від зміни кольорів тексту OK
та CANCEL
тексту. Непогано.
Таким чином, вам не потрібно надавати DatePickerDialog's
конструктору будь-яку інформацію про стилі . Все провідно правильно:
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();