नील के सुझाव के कारण फुलस्क्रीन 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();
यह, मेरी राय में, अच्छा नहीं है। किसी को स्टाइल को जावा और अंदर की शैलियों से बाहर रखने की कोशिश करनी चाहिए। xml / themes.xml।
मैं इस बात से सहमत हूं कि नील का सुझाव, थोड़ा बदलाव (कहने के लिए मूल विषय को बदलते हुए Theme.Material.Light.Dialog
) के साथ आपको वांछित परिणाम मिलेगा। लेकिन, यहाँ दूसरा तरीका है:
पहले निरीक्षण पर, हम आते हैं datePickerStyle
जो चीजों को परिभाषित करता है जैसे: headerBackground
(जो आप बदलने की कोशिश कर रहे हैं) dayOfWeekBackground
, और कुछ अन्य पाठ-रंग और पाठ-शैली।
आपके ऐप के विषय में इस विशेषता को ओवरराइड करने से काम नहीं चलेगा। DatePickerDialog
विशेषता द्वारा असाइन किए गए एक अलग विषय का उपयोग करता है datePickerDialogTheme
। इसलिए, हमारे परिवर्तनों को प्रभावित करने के लिए, हमें एक ओवरराइड के अंदर ओवरराइडdatePickerStyle
datePickerDialogTheme
करना चाहिए ।
ये रहा:
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();