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