Як змінити колір діалогового вікна DatePicker для Android 5.0


111

Чи можна змінити колірну схему датчика (а також тимчасового вибору) на 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>

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

Щось таке: введіть тут опис зображення


Якого кольору ваш кольоровий акцент задано у стилях тем вашого додатка
Ніл,

@Neil Я додав код, який я до цього часу намагався використовувати для стилізації.
Warpzit

Відповіді:


322

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

8
Дякуємо за хороший і повний опис того, як це працює і як його потрібно було перекрити в стилях
Warpzit

Відмінне пояснення @Vikram, як ми можемо змінити нормально, скасувати колір тексту?
Діліп

1
@Vikram календарSelectedTextColor не знайдено.
Ахілеш Дхар Дюбей

7
Чи можливо бути зворотним сумісним для Android <21 the datePicker?
RoCk RoCk

1
@RoCk Не впевнений, що ти маєш на увазі, але я створив бібліотеку, щоб перенести вибирачі дати та часу з андроїд версії 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

EDIT - Змінено тему на 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 дякую за відповідь, вказав мені в правильному напрямку, і це правильно швидке рішення, але я шукав підхід у стилі / темі :)
Warpzit

Не працює на android 6, він повноекранний і колір не змінюється
Jemshit Iskenderov

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>

Ця відповідь не вимагає v24 apis та вище 💪
Michael

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

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, брато!
сам

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>

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

Для зміни кольору тексту елемента списку років (СПЕЦИФІЧНИЙ ДЛЯ АНДРОІДу 5.0)

Просто встановіть певний колір тексту у діалоговому стилі вибору дати. Чомусь прапор встановлення yearListItemTextAppearanceне відображає жодних змін у списку року.

<item name="android:textColor">@android:color/black</item>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.