Ответ 1
Причина, по которой предложение Neil приводит к полноэкранному экрану 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 и внутри styles.xml/themes.xml.
Я согласен с тем, что предложение Neil с небольшим изменением (изменение родительской темы, чтобы сказать, 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
(это также связано с тем, что предложение Neil работает при смене фона). Но существует довольно много настроек:
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();