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();