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

Можно ли изменить цветовую схему 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>

От оригинала: enter image description here

Что-то вроде этого: enter image description here

Ответ 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();

Ответ 2

Попробуйте.

Код

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>

Ответ 3

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

Поместите два параметра: 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>

Ответ 4

Как раз упомянуть, вы также можете использовать по умолчанию тему типа 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();

Ответ 5

У вас нет темы для создания, просто напишите ее в объекте создания диалога

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/

Ответ 6

У меня возникла проблема, что кнопки выбора времени не отображались на экране 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>

Ответ 7

<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>

Ответ 8

Для изменения цвета текста элемента списка "Изменение года" (УКАЗАНО ДЛЯ Android 5.0)

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

<item name="android:textColor">@android:color/black</item>

Ответ 9

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

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

Результат:

enter image description here