สาเหตุที่ข้อเสนอแนะของ 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
ฉันยอมรับว่าคำแนะนำของนีลที่มีการเปลี่ยนแปลงเล็กน้อย (เปลี่ยนธีมหลักเพื่อพูดTheme.Material.Light.Dialog
) จะทำให้คุณได้ผลลัพธ์ที่ต้องการ แต่นี่เป็นวิธีอื่น:
ในการตรวจสอบครั้งแรกเราพบdatePickerStyle
สิ่งที่กำหนดสิ่งต่างๆเช่น: headerBackground
(สิ่งที่คุณพยายามจะเปลี่ยนแปลง) dayOfWeekBackground
และสีข้อความและลักษณะข้อความอื่น ๆ
การลบล้างแอตทริบิวต์นี้ในธีมของแอปจะไม่ทำงาน ใช้ธีมมอบหมายโดยแยกแอตทริบิวต์DatePickerDialog
datePickerDialogTheme
ดังนั้นการเปลี่ยนแปลงของเราที่จะใช้ส่งผลกระทบต่อเราจะต้องแทนที่datePickerStyle
ภายใน datePickerDialogTheme
overriden
ไปเลย:
แทนที่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
(นี่คือสาเหตุที่คำแนะนำของนีลทำงานในการเปลี่ยนพื้นหลัง) แต่มีการปรับแต่งได้ค่อนข้างมาก:
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();