Lý do tại sao đề xuất của Neil dẫn đến toàn màn hình DatePickerlà do lựa chọn chủ đề chính:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Hơn nữa, nếu bạn đi theo con đường này, bạn phải chỉ định chủ đề trong khi tạo 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();
Điều này, theo tôi, là không tốt. Bạn nên cố gắng giữ kiểu dáng bên ngoài java và bên trong styles.xml / themes.xml.
Tôi đồng ý rằng đề xuất của Neil, với một chút thay đổi (thay đổi chủ đề chính để nói, Theme.Material.Light.Dialog ) sẽ mang lại cho bạn kết quả mong muốn. Nhưng, đây là cách khác:
Trong lần kiểm tra đầu tiên, chúng tôi bắt gặp datePickerStylenhững thứ xác định những thứ như: headerBackground(những gì bạn đang cố gắng thay đổi) dayOfWeekBackground, và một số màu văn bản và kiểu văn bản khác.
Ghi đè thuộc tính này trong chủ đề ứng dụng của bạn sẽ không hoạt động. DatePickerDialogsử dụng một chủ đề riêng biệt có thể chỉ định bởi thuộc tính datePickerDialogTheme. Vì vậy, để các thay đổi của chúng tôi có hiệu lực, chúng tôi phải ghi đè datePickerStylebên trong một ghi đèdatePickerDialogTheme .
Chúng ta bắt đầu:
Ghi đè datePickerDialogThemebên trong chủ đề cơ sở của ứng dụng của bạn:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Xác định MyDatePickerDialogTheme. Việc lựa chọn chủ đề chính sẽ phụ thuộc vào chủ đề cơ sở của ứng dụng của bạn: nó có thể là một trong hai Theme.Material.Dialoghoặc Theme.Material.Light.Dialog:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Chúng tôi đã ghi đè datePickerStylevới phong cách MyDatePickerStyle. Lựa chọn của phụ huynh một lần nữa sẽ phụ thuộc vào chủ đề cơ sở của ứng dụng của bạn là gì: hoặc Widget.Material.DatePickerhoặc Widget.Material.Light.DatePicker. Xác định nó theo yêu cầu của bạn:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Hiện tại, chúng tôi chỉ ghi đè headerBackgroundtheo mặc định được đặt thành ?attr/colorAccent(đây cũng là lý do tại sao đề xuất Neil hoạt động trong việc thay đổi nền). Nhưng có thể tùy chỉnh khá nhiều:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Nếu bạn không muốn kiểm soát nhiều (tùy chỉnh) này, bạn không cần phải ghi đè datePickerStyle. colorAccentkiểm soát hầu hết các DatePicker'smàu. Vì vậy, chỉ ghi đè colorAccentbên trong MyDatePickerDialogThemesẽ hoạt động:
<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>
Ghi đè colorAccentmang lại cho bạn lợi ích bổ sung của việc thay đổi OK&CANCEL màu văn bản. Không tệ.
Bằng cách này, bạn không phải cung cấp bất kỳ thông tin kiểu dáng nào cho hàm DatePickerDialog'stạo. Mọi thứ đã được nối dây đúng cách:
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();