Причина, через яку пропозиція Ніла призводить до повноекранного екрану, 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();