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


113

निम्नलिखित Theme.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 के लिए बहुत कम विशेषताएँ परिभाषित हैं - मैं उत्सुक हूं कि ThemeOverlay के लिए इच्छित उपयोग का मामला क्या है।

जवाबों:


71

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

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

ThemeOverlay + ActionBar

आप की गहरी आंखों ने भी देखा होगा ActionBar ThemeOverlay डेरिवेटिव:

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

इन्हें केवल नई actionBarThemeविशेषता के माध्यम से एक्शन बार के साथ या सीधे आपके टूलबार पर सेट किया जाना चाहिए ।

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


155

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

आइए एक उदाहरण देखें कि यह क्यों आवश्यक है।

एक ActionBar के साथ अनुप्रयोग विषयों

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

<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>

यहां छवि विवरण दर्ज करें

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

ActionBar को छुपाना और टूलबार का उपयोग करना

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

यहां छवि विवरण दर्ज करें

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

ऐप थीम को ओवरराइड करना

यहाँ वह जगह है जहाँ ThemeOverlay आता है। मैं अपने टूलबार xml लेआउट में Dark ActionBar विषय निर्दिष्ट कर सकता हूँ।

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

यह आखिरकार हमें वह प्रभाव देने की अनुमति देता है जो हम चाहते हैं। Dark.ActionBar विषय इस विशेष अवसर के लिए लाइट ऐप थीम को ओवरले करता है।

यहां छवि विवरण दर्ज करें

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

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

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

आगे के अध्ययन

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


Themeoverlay का उपयोग करते समय स्टेटस बार को पारदर्शी कैसे बनाएं?
gegobyte

मैं सोच रहा हूं कि नए
डेविड 13

@ डेविड, मैं अब ज्यादातर स्पंदन के साथ काम कर रहा हूं, इसलिए मैंने नए एंड्रॉइड विकास पर ध्यान नहीं दिया है। यदि आपको उत्तर यहाँ वापस आने और टिप्पणी छोड़ने के लिए स्वतंत्र महसूस हो रहा है, तो मेरे उत्तर को संपादित करें, या अपना उत्तर जोड़ें।
सुरगाछ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.