A razão pela qual a sugestão de Neil resulta em tela cheia DatePicker
é a escolha do tema pai:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Além disso, se você seguir esse caminho, deverá especificar o tema ao criar 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();
Isso, na minha opinião, não é bom. Deve-se tentar manter o estilo fora de java e dentro de styles.xml / themes.xml.
Eu concordo que a sugestão de Neil, com um pouco de mudança (mudando o tema pai para dizer, Theme.Material.Light.Dialog
), você obterá o resultado desejado. Mas, aqui está a outra maneira:
Na primeira inspeção, encontramos o datePickerStyle
que define coisas como: headerBackground
(o que você está tentando mudar) dayOfWeekBackground
, e algumas outras cores e estilos de texto.
Substituir este atributo no tema do seu aplicativo não funcionará. DatePickerDialog
usa um tema separado atribuível pelo atributo datePickerDialogTheme
. Portanto, para que nossas alterações tenham efeito, devemos substituir datePickerStyle
dentro de uma substituiçãodatePickerDialogTheme
.
Aqui vamos nós:
Substituir datePickerDialogTheme
dentro do tema base do seu aplicativo:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Defina MyDatePickerDialogTheme
. A escolha do tema pai dependerá de qual é o tema base do seu aplicativo: pode ser Theme.Material.Dialog
ou Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Nós substituímos datePickerStyle
com o estilo MyDatePickerStyle
. A escolha do pai mais uma vez dependerá de qual é o tema base do seu aplicativo: ou Widget.Material.DatePicker
ou Widget.Material.Light.DatePicker
. Defina-o de acordo com seus requisitos:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Atualmente, estamos apenas substituindo o headerBackground
que por padrão é definido como ?attr/colorAccent
(é também por isso que a sugestão de Neil funciona na mudança do plano de fundo). Mas há bastante personalização possível:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Se você não deseja tanto controle (personalização), não é necessário substituí-lo datePickerStyle
. colorAccent
controla a maioria das DatePicker's
cores. Portanto, substituir apenas colorAccent
dentro MyDatePickerDialogTheme
deve 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>
Substituindo colorAccent
lhe dá a vantagem de mudar OK
e CANCEL
cores de texto também. Não é ruim.
Dessa forma, você não precisa fornecer nenhuma informação de estilo ao DatePickerDialog's
construtor. Tudo foi conectado corretamente:
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();