Cómo cambiar el color del cuadro de diálogo DatePicker para Android 5.0

Resuelto Warpzit asked hace 54 años • 10 respuestas

¿Es posible cambiar el esquema de color del selector de fecha (y también del selector de hora) para Android 5.0?

Intenté configurar los colores de acento, pero esto no funciona (tanto con como sin 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>

Del original:

Original

A algo como esto:

recoloreado

Warpzit avatar Jan 01 '70 08:01 Warpzit
Aceptado

La razón por la que la sugerencia de Neil da como resultado una pantalla completa DatePickeres la elección del tema principal:

<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
    <item name="colorAccent">@color/blue_500</item>
</style>

Además, si sigue esta ruta, debe especificar el tema al crear 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();

Esto, en mi opinión, no es bueno. Se debería intentar mantener el estilo fuera de Java y dentro de estilos.xml/themes.xml.

Estoy de acuerdo en que la sugerencia de Neil, con un pequeño cambio (cambiar el tema principal para que diga Theme.Material.Light.Dialog) le dará el resultado deseado. Pero aquí está la otra manera:

En la primera inspección, nos encontramos con datePickerStyleque define cosas como: headerBackground(lo que está intentando cambiar), dayOfWeekBackgroundy algunos otros colores y estilos de texto.

Anular este atributo en el tema de su aplicación no funcionará. DatePickerDialogutiliza un tema separado asignable por el atributo datePickerDialogTheme. Entonces, para que nuestros cambios surtan efecto, debemos anular datePickerStyledentro de un overridendatePickerDialogTheme .

Aquí vamos:

Anular datePickerDialogThemedentro del tema base de tu aplicación:

<style name="AppBaseTheme" parent="android:Theme.Material.Light">
    ....
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

Definir MyDatePickerDialogTheme. La elección del tema principal dependerá de cuál sea el tema base de su aplicación: podría ser cualquiera de los Theme.Material.Dialogdos Theme.Material.Light.Dialog:

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

Hemos anulado datePickerStylecon el estilo MyDatePickerStyle. La elección del padre dependerá una vez más de cuál sea el tema base de su aplicación: Widget.Material.DatePickero Widget.Material.Light.DatePicker. Defínelo según tus requisitos:

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>

Actualmente, solo estamos anulando headerBackgroundlo que está configurado de forma predeterminada ?attr/colorAccent(esta es también la razón por la que la sugerencia de Neil funciona para cambiar el fondo). Pero hay muchas posibilidades de personalización:

dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor

Si no desea tanto control (personalización), no necesita anular datePickerStyle. colorAccentcontrola la mayoría de los DatePicker'scolores. Entonces, anular colorAccentel interior MyDatePickerDialogThemedebería funcionar:

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

La anulación colorAccentle brinda el beneficio adicional de cambiar también los colores del texto OK. CANCELNada mal.

De esta manera no es necesario proporcionar ninguna información de estilo al DatePickerDialog'sconstructor. Todo ha sido cableado correctamente:

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();
Vikram avatar Mar 12 '2015 15:03 Vikram

Pruébalo.

El código

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

El estilo en su archivo estilos.xml

EDITAR: tema cambiado a Theme.AppCompat.Light.Dialog como se sugiere

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>
the-ginger-geek avatar Feb 26 '2015 09:02 the-ginger-geek

Crea un nuevo estilo

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

código Java:

El tema principal es la clave aquí. Elige tu colorAcento

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

Resultado:

ingrese la descripción de la imagen aquí

Siddharth Jaswal avatar Dec 12 '2018 06:12 Siddharth Jaswal