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 datePickerStyleque 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á. DatePickerDialogusa um tema separado atribuível pelo atributo datePickerDialogTheme. Portanto, para que nossas alterações tenham efeito, devemos substituir datePickerStyledentro de uma substituiçãodatePickerDialogTheme .
Aqui vamos nós:
Substituir datePickerDialogThemedentro 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.Dialogou 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 datePickerStylecom o estilo MyDatePickerStyle. A escolha do pai mais uma vez dependerá de qual é o tema base do seu aplicativo: ou Widget.Material.DatePickerou 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 headerBackgroundque 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. colorAccentcontrola a maioria das DatePicker'scores. Portanto, substituir apenas colorAccentdentro MyDatePickerDialogThemedeve 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 colorAccentlhe dá a vantagem de mudar OKe CANCELcores de texto também. Não é ruim.
Dessa forma, você não precisa fornecer nenhuma informação de estilo ao DatePickerDialog'sconstrutor. 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();