android किसी को Theme.AppCompat बनाम ThemeOverlay.AppCompat का उपयोग कब करना चाहिए?




android-theme (2)

AppCompat के निर्माता द्वारा इस थीम बनाम स्टाइल ब्लॉग पोस्ट के अनुसार:

[ThemeOverlays] विशेष थीम हैं जो सामान्य थीम को ओवरले करते हैं। सामग्री थीम, प्रासंगिक विशेषताओं को ओवरराइट करने के लिए उन्हें या तो हल्का / अंधेरा बनाते हैं।

थीमऑवरले + एक्शनबार

आप की गहरी आंखों ने एक्शनबार थीम ओवरले डेरिवेटिव्स को भी देखा होगा:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar

इन्हें केवल नई कार्रवाई के माध्यम से एक्शन बार के साथ उपयोग किया जाना चाहिए, या उनके टूलबार पर सीधे सेट करें।

वर्तमान में ये केवल माता-पिता के लिए अलग-अलग चीजें हैं, वे colorControlNormal को android:textColorPrimary , इस प्रकार कोई भी टेक्स्ट और आइकन अपारदर्शी बनाते हैं।

निम्नलिखित थीम हैं। AppCompat कक्षाएं:

Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar
Theme.AppCompat.NoActionBar
Theme.AppCompat.Light.NoActionBar
Theme.AppCompat.DialogWhenLarge
Theme.AppCompat.Light.DialogWhenLarge
Theme.AppCompat.Dialog
Theme.AppCompat.Light.Dialog
Theme.AppCompat.CompactMenu

और निम्नलिखित ThemeOverlay.AppCompat कक्षाएं:

ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar

क्यों ThemeOverlay.AppCompat.light बनाम Theme.AppCompat.Light उदाहरण के लिए उपयोग करेंगे? मैं देखता हूं कि ThemeOverlay के लिए परिभाषित बहुत कम विशेषताएं हैं - मैं उत्सुक हूं कि थीमओवरले के लिए इच्छित उपयोग केस क्या है।


Theme.AppCompat का उपयोग पूरे ऐप के लिए वैश्विक थीम सेट करने के लिए किया जाता है। ThemeOverlay.AppCompat का उपयोग विशिष्ट विचारों, विशेष रूप से टूलबार के लिए थीम को ओवरराइड (या "ओवरले") करने के लिए किया जाता है।

चलो एक उदाहरण देखें कि यह क्यों जरूरी है।

एक्शनबार के साथ ऐप थीम

एक्शनबार आमतौर पर एक ऐप में दिखाया जाता है। मैं colorPrimary मान सेट करके इसका रंग चुन सकता हूं। हालांकि, विषय बदलने से एक्शनबार पर टेक्स्ट का रंग बदल जाता है।

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

चूंकि मेरा प्राथमिक रंग गहरा नीला है, इसलिए मुझे शायद उन विषयों में से एक का उपयोग करना चाहिए जो एक्शन बार में हल्के टेक्स्ट रंग का उपयोग करते हैं क्योंकि काले पाठ को पढ़ने में मुश्किल होती है।

एक्शनबार छुपाएं और टूलबार का उपयोग करना

Theme.Appaterial के बजाय Theme.AppCompat का उपयोग करने का पूरा बिंदु यह है कि हम एंड्रॉइड के पुराने संस्करणों को हमारी सामग्री डिज़ाइन थीम का उपयोग करने की अनुमति दे सकते हैं। समस्या यह है कि एंड्रॉइड के पुराने संस्करण एक्शनबार का समर्थन नहीं करते हैं। इस प्रकार, documentation एक्शनबार को छिपाने और आपके लेआउट में टूलबार जोड़ने की सिफारिश करता है। एक्शनबार को छिपाने के लिए हमें NoActionBar थीम में से एक का उपयोग करना होगा। निम्न छवियां टूलबार को एक्शनबार के साथ छिपी हुई दिखाती हैं।

लेकिन क्या होगा यदि मुझे डार्कएक्शनबार के साथ लाइट थीम की तरह कुछ चाहिए? चूंकि मुझे NoActionBar का उपयोग करना है, यह एक विकल्प नहीं है।

ऐप थीम ओवरराइडिंग

यहां वह थीम है जहां थीमऑवरले आता है। मैं अपने टूलबार एक्सएमएल लेआउट में डार्क एक्शनबार थीम निर्दिष्ट कर सकता हूं।

<android.support.v7.widget.Toolbar
    ...
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

यह अंततः हमें वह प्रभाव प्राप्त करने की इजाजत देता है जो हम चाहते हैं। डार्क। एक्शनबार थीम इस विशेष अवसर के लिए लाइट ऐप थीम को ओवरले करती है।

  • ऐप थीम: Theme.AppCompat.Light.NoActionBar
  • टूलबार थीम: ThemeOverlay.AppCompat.Dark.ActionBar

यदि आप चाहते थे कि पॉपअप मेनू प्रकाश हो, तो आप इसे जोड़ सकते हैं:

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

आगे के अध्ययन

मैंने प्रयोग के माध्यम से और निम्नलिखित लेख पढ़ने के माध्यम से यह सीखा।







android-theme