Lý do tại sao đề xuất của Neil dẫn đến toàn màn hình DatePicker
là 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 datePickerStyle
nhữ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. DatePickerDialog
sử 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 đè datePickerStyle
bên trong một ghi đèdatePickerDialogTheme
.
Chúng ta bắt đầu:
Ghi đè datePickerDialogTheme
bê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.Dialog
hoặ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 đè datePickerStyle
vớ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.DatePicker
hoặ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 đè headerBackground
theo 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
. colorAccent
kiểm soát hầu hết các DatePicker's
màu. Vì vậy, chỉ ghi đè colorAccent
bên trong MyDatePickerDialogTheme
sẽ 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 đè colorAccent
mang 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's
tạ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();