Neil的建议能够实现全屏
DatePicker
的原因是因为父主题的选择:
<!
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
此外,如果您选择该路线,则必须在创建DatePickerDialog
时指定主题:
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}, 2015, 02, 26).show();
依我之见,这并不好。应该尽量将样式放在styles.xml/themes.xml内而非Java代码中。
我同意Neil的建议,在稍微修改一下(比如把父主题改为Theme.Material.Light.Dialog
)后你就可以得到想要的结果。但是,这里有另外一种方式:
首先考虑到datePickerStyle
属性,其中定义了一些东西,例如: headerBackground
(你想要更改的内容),dayOfWeekBackground
和一些其他的文字颜色和文字样式。
在你应用程序的主题中覆盖此属性将不起作用。DatePickerDialog
使用一个单独的主题,可以通过属性datePickerDialogTheme
进行分配。因此,为了使我们的更改生效,我们必须在重载的datePickerDialogTheme
中覆盖datePickerStyle
。
现在开始操作:
在你应用程序的基本主题中覆盖datePickerDialogTheme
:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
定义MyDatePickerDialogTheme
。父主题的选择取决于您的应用程序基本主题是什么:它可以是Theme.Material.Dialog
或Theme.Material.Light.Dialog
中的任何一个:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
我们已经用样式MyDatePickerStyle
覆盖了datePickerStyle
。选择父类将再次取决于您的应用程序基础主题: Widget.Material.DatePicker
或Widget.Material.Light.DatePicker
。根据您的要求定义它:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
目前,我们只覆盖了headerBackground
,默认情况下它被设置为?attr/colorAccent
(这也是为什么Neil建议在更改背景时有效的原因)。但是有很多自定义选项:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
如果您不希望过多的控制(定制),则无需覆盖datePickerStyle
。 colorAccent
控制大多数 DatePicker
的颜色。因此,在 MyDatePickerDialogTheme
中仅覆盖 colorAccent
应该就可以了:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:colorAccent">@color/date_picker_accent</item>
<!
<!
</style>
覆盖 colorAccent
属性可以使 OK
和 CANCEL
文字的颜色也一并改变,不错。
这样你就不需要在 DatePickerDialog
的构造函数中提供任何样式信息了。一切都已经正确地连接好了:
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();