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 mientras crea 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. Uno debería intentar mantener el estilo fuera de Java y dentro de styles.xml / themes.xml.
Estoy de acuerdo en que la sugerencia de Neil, con un poco de cambio (cambiando el tema principal para decir, Theme.Material.Light.Dialog
) obtendrá el resultado deseado. Pero aquí está la otra forma:
En la primera inspección, nos encontramos con datePickerStyle
que define cosas como: headerBackground
(lo que está tratando de cambiar) dayOfWeekBackground
, y algunos otros colores de texto y estilos de texto.
No funcionará anular este atributo en el tema de su aplicación. DatePickerDialog
utiliza un tema independiente asignable por el atributo datePickerDialogTheme
. Por lo tanto, para que nuestros cambios surtan efecto, debemos anular datePickerStyle
dentro de un anuladodatePickerDialogTheme
.
Aquí vamos:
Anular datePickerDialogTheme
dentro del tema base de su 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 Theme.Material.Dialog
o 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 es el tema base de su aplicación: Widget.Material.DatePicker
o Widget.Material.Light.DatePicker
. Defínalo según sus 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 lo headerBackground
que está configurado de forma predeterminada en ?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 solo el colorAccent
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>
Anulando colorAccent
le da el beneficio adicional de cambiar OK
y CANCEL
los colores del texto también. No está mal.
De esta manera, no tiene que 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();