Как изменить цвет диалогового окна DatePicker для Android 5.0

111

Можно ли изменить цветовую схему datepicker (а также timepicker) для Android 5.0?

Я пробовал установить цвета акцента, но это не работает (как с, так и без android:):

<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/purple</item>

<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/purple_tint</item>

<!-- colorAccent is used as the default value for colorControlActivated
     which is used to tint widgets -->
<item name="colorAccent">@color/purple_tint</item>

Из оригинала: введите описание изображения здесь

Примерно так: введите описание изображения здесь

Warpzit
источник
На какой цвет установлен ваш цветовой акцент в стилях тем приложения
Нил,
@Neil Я добавил код, который пытался использовать для стилизации.
Warpzit

Ответы:

323

Причина, по которой предложение Нила приводит к полноэкранному режиму, 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();
Викрам
источник
8
Спасибо за хорошее и полное описание того, как это работает и как это нужно было переопределить в стилях
Warpzit
Отличное объяснение @Vikram, как мы можем изменить ок, отменить цвет текста?
Дилип
1
@Vikram calendarSelectedTextColor не найден.
Ахилеш Дхар Дубей
7
Возможно ли быть обратно совместимым для android <21 datePicker?
RoCk RoCk
1
@RoCk Не понимаю, что вы имеете в виду, но я создал библиотеку для резервного переноса средств выбора даты и времени с версии Android 23 на версию 14. Проект размещен по адресу: https://github.com/vikramkakkar/SublimePicker .
Викрам
68

Попробуйте.

Код

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();

Стиль в вашем файле styles.xml

РЕДАКТИРОВАТЬ - Тема изменена на Theme.AppCompat.Light.Dialog, как было предложено

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>
Нил
источник
2
Да, он фиолетовый, но тоже в полноэкранном режиме :) но, возможно, если я вставлю его внутрь фрагмента, он будет содержаться. Есть какие-нибудь предложения, прежде чем я снова начну с ним играть?
Warpzit
Я посмотрю, смогу ли я найти более подходящее решение, которое не заставит его работать в полноэкранном режиме
Нил
9
Просто используйте parent="Theme.AppCompat.Light.Dialog"вместоparent="Theme.AppCompat.Light"
Чупик
@Neil, спасибо за ответ, указал мне в правильном направлении, и это, по сути, самое быстрое решение, но я искал подход,
основанный на стилях и темах
Не работает на android 6, он полноэкранный и цвет не меняется
Джемшит Искендеров
16

Создать новый стиль

<!-- Theme.AppCompat.Light.Dialog -->
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>

Код Java:

Родительская тема здесь является ключевой. Выберите свой цветАкцент

DatePickerDialog = new DatePickerDialog(context,R.style.DialogTheme,this,now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DAY_OF_MONTH);

Результат:

введите описание изображения здесь

Сиддхарт Джасвал
источник
6

попробуйте это, работайте для меня

Ставим два варианта, colorAccentиandroid:colorAccent

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
   ....
    <item name="android:dialogTheme">@style/AppTheme.DialogTheme</item>
    <item name="android:datePickerDialogTheme">@style/Dialog.Theme</item>
</style>

<style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">

<!-- Put the two options, colorAccent and android:colorAccent. -->
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:colorAccent">@color/colorPrimary</item>
 </style>
Герал Александр Торрес
источник
Этот ответ не требует API v24 и выше 💪
Майкл
3

Чтобы упомянуть, вы также можете использовать тему по умолчанию, например android.R.style.Theme_DeviceDefault_Light_Dialog.

new DatePickerDialog(MainActivity.this, android.R.style.Theme_DeviceDefault_Light_Dialog, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    //DO SOMETHING
    }
}, 2015, 02, 26).show();
user1214120
источник
1

Вам не нужно создавать тему, просто напишите ее в своем объекте создания диалога.

DatePickerDialog datePicker = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT,this, mYear, mMonth, mDay);

следуйте этому, он даст вам весь стиль выбора даты, это действительно работает

http://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/

Авинаш Аджай Пандей
источник
Работает как Gem, братан!
sam
AlertDialog.THEME_HOLO_LIGHT устарел .. не работает
Yash
1

У меня была проблема, что кнопки выбора времени не были видны на экране для API 24 в Android. (API 21+) решается

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
            <item name="android:colorAccent">@color/colorPrimary2</item></style>

<style name="Theme" parent="BBaseTheme">
         <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Самет ÖZTOPRAK
источник
1
<style name="AppThemeDatePicker" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/select2</item>
    <item name="android:colorAccent">@color/select2</item>
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>


<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/select2</item>
</style>
Кешав Гера
источник
0

Для изменения цвета текста элемента списка "Год" (СПЕЦИАЛЬНО ДЛЯ ANDROID 5.0)

Просто установите определенный цвет текста в стиле диалога выбора даты. По какой-то причине установка флага yearListItemTextAppearanceне отражает никаких изменений в списке лет.

<item name="android:textColor">@android:color/black</item>
user3354265
источник