नील के सुझाव के कारण फुलस्क्रीन 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। इसलिए, हमारे परिवर्तनों को प्रभावित करने के लिए, हमें एक ओवरराइड के अंदर ओवरराइडdatePickerStyledatePickerDialogTheme करना चाहिए ।
ये रहा:
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();