尼尔的建议导致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 分配的单独主题。因此,为了使我们的更改生效,我们必须在覆盖的 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(这也是尼尔建议在改变背景时起作用的原因)。但是可以进行很多自定义:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
如果您不想要这么多的控制(自定义),则无需覆盖datePickerStyle。 colorAccent 控制大部分 DatePicker's 颜色。因此,在 MyDatePickerDialogTheme 中仅覆盖 colorAccent 应该可以:
<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();