Изменить цвет диалога 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>

Из оригинала:

Чтобы что-то вроде этого:

10 ответов

Решение

Причина, по которой предложение Нила приводит к полноэкранному режиму 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,

Вот так:

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

Дайте это попробовать.

Код

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>

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

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

Результат:

ht tps://stackru.com/images/2d8bcb5526a9e362773260940515e42fcfcf6a5e.png

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

Поставь два варианта, 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>

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

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

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

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/

Котлин, 2021 г.

      // set date as button text if pressed
btnDate.setOnClickListener(View.OnClickListener {

    val dpd = DatePickerDialog(
        this,
        { view, year, monthOfYear, dayOfMonth ->
            val selectDate = Calendar.getInstance()
            selectDate.set(Calendar.YEAR, year)
            selectDate.set(Calendar.MONTH, monthOfYear)
            selectDate.set(Calendar.DAY_OF_MONTH, dayOfMonth)

            var formatDate = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
            val date = formatDate.format(selectDate.time)
            Toast.makeText(this, date, Toast.LENGTH_SHORT).show()
            btnDate.text = date
        }, 1990, 6, 6
    )

    val calendar = Calendar.getInstance()
    val year = calendar[Calendar.YEAR]
    val month = calendar[Calendar.MONTH]
    val day = calendar[Calendar.DAY_OF_MONTH]
    dpd.datePicker.minDate = GregorianCalendar(year - 90, month, day, 0, 0).timeInMillis
    dpd.datePicker.maxDate = GregorianCalendar(year - 10, month, day, 0, 0).timeInMillis
    dpd.show()
})

Styles.xml

      <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- This is main Theme Style for your application! -->
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker">
    <item name="android:headerBackground">#A500FF</item>
</style>

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

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

<item name="android:textColor">@android:color/black</item>
Другие вопросы по тегам