Alasan mengapa saran Neil menghasilkan layar penuh DatePicker
adalah pilihan tema induk:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Selain itu, jika Anda mengikuti rute ini, Anda harus menentukan tema saat membuat 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();
Ini, menurut saya, tidak baik. Seseorang harus mencoba untuk menjaga styling dari java dan di dalam styles.xml / themes.xml.
Saya setuju bahwa saran Neil, dengan sedikit perubahan (mengubah tema induk menjadi, Theme.Material.Light.Dialog
) akan memberi Anda hasil yang diinginkan. Tapi, inilah cara lain:
Pada pemeriksaan pertama, kami menemukan datePickerStyle
yang mendefinisikan hal-hal seperti: headerBackground
(apa yang Anda coba ubah) dayOfWeekBackground
, dan beberapa warna teks dan gaya teks lainnya.
Mengganti atribut ini di tema aplikasi Anda tidak akan berfungsi. DatePickerDialog
menggunakan tema terpisah yang dapat ditentukan oleh atribut datePickerDialogTheme
. Jadi, agar perubahan kita berpengaruh, kita harus mengganti datePickerStyle
inside a overridendatePickerDialogTheme
.
Kita mulai:
Ganti datePickerDialogTheme
di dalam tema dasar aplikasi Anda:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Tentukan MyDatePickerDialogTheme
. Pilihan tema induk akan bergantung pada apa tema dasar aplikasi Anda: bisa jadi Theme.Material.Dialog
atau Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Kami telah menimpa datePickerStyle
dengan gaya MyDatePickerStyle
. Pilihan induk sekali lagi akan bergantung pada apa tema dasar aplikasi Anda: baik Widget.Material.DatePicker
atau Widget.Material.Light.DatePicker
. Tentukan sesuai kebutuhan Anda:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Saat ini, kami hanya mengganti headerBackground
yang secara default disetel ke ?attr/colorAccent
(ini juga mengapa saran Neil berfungsi dalam mengubah latar belakang). Tetapi ada cukup banyak kemungkinan penyesuaian:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Jika Anda tidak ingin banyak kontrol (kustomisasi), Anda tidak perlu mengganti datePickerStyle
. colorAccent
mengontrol sebagian besar DatePicker's
warna. Jadi, mengesampingkan just colorAccent
inside MyDatePickerDialogTheme
seharusnya berfungsi:
<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>
Mengganti colorAccent
memberi Anda manfaat tambahan dari mengubah OK
& CANCEL
warna teks juga. Tidak buruk.
Dengan cara ini Anda tidak perlu memberikan informasi gaya apa pun ke DatePickerDialog's
konstruktor. Semuanya telah terhubung dengan benar:
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();