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 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 datePickerStyleque 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. DatePickerDialogutiliza un tema independiente asignable por el atributo datePickerDialogTheme. Por lo tanto, para que nuestros cambios surtan efecto, debemos anular datePickerStyledentro de un anuladodatePickerDialogTheme .
Aquí vamos:
Anular datePickerDialogThemedentro 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.Dialogo 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 es el tema base de su aplicación: Widget.Material.DatePickero 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 headerBackgroundque 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. colorAccentcontrola la mayoría de los DatePicker'scolores. Entonces, anular solo el colorAccentinterior 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>
Anulando colorAccentle da el beneficio adicional de cambiar OKy CANCELlos colores del texto también. No está mal.
De esta manera, no tiene que 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();