Cómo cambiar el color del cuadro de diálogo DatePicker para Android 5.0
¿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:
A algo como esto:
La razón por la que la sugerencia de Neil da como resultado una pantalla completa DatePicker
es 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 datePickerStyle
que define cosas como: headerBackground
(lo que está intentando cambiar), dayOfWeekBackground
y algunos otros colores y estilos de texto.
Anular este atributo en el tema de su aplicación no funcionará. DatePickerDialog
utiliza un tema separado asignable por el atributo datePickerDialogTheme
. Entonces, para que nuestros cambios surtan efecto, debemos anular datePickerStyle
dentro de un overridendatePickerDialogTheme
.
Aquí vamos:
Anular datePickerDialogTheme
dentro 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.Dialog
dos Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Hemos anulado datePickerStyle
con 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.DatePicker
o 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 headerBackground
lo 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
. colorAccent
controla la mayoría de los DatePicker's
colores. Entonces, anular colorAccent
el interior MyDatePickerDialogTheme
deberí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 colorAccent
le brinda el beneficio adicional de cambiar también los colores del texto OK
. CANCEL
Nada mal.
De esta manera no es necesario proporcionar ninguna información de estilo al DatePickerDialog's
constructor. 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();
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>
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: