Neil的建议导致全屏显示的原因DatePicker是选择父主题:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
此外,如果您走这条路线,则必须在创建时指定主题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();
我认为这不好。应该尝试将样式保持在Java之外,并放在styles.xml / themes.xml中。
我同意Neil的建议(稍有更改(将父主题更改为Theme.Material.Light.Dialog))将为您带来预期的结果。但是,这是另一种方式:
第一次检查时,我们发现datePickerStyle其中定义了以下内容:(headerBackground您要更改的内容)dayOfWeekBackground,和其他一些文本颜色和文本样式。
无法在您的应用主题中覆盖此属性。DatePickerDialog使用可通过属性分配的单独主题datePickerDialogTheme。因此,对于我们的更改生效,就必须重写datePickerStyle一个被覆盖的内部datePickerDialogTheme。
开始了:
覆盖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>
我们已经取代datePickerStyle了样式MyDatePickerStyle。父级的选择将再次取决于您应用的基本主题: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's颜色。因此,覆盖colorAccent内部MyDatePickerDialogTheme应该可以工作:
<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>
覆盖还colorAccent为您带来了更改OK和CANCEL文本颜色的额外好处。不错。
这样,您不必向DatePickerDialog's构造函数提供任何样式信息。一切都已正确接线:
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();