गहरे रंग वाली थीम लागू करना

Compose का इस्तेमाल करके मैसेज लिखना
Android के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर सुझाया जाता है. Compose में थीम इस्तेमाल करने का तरीका जानें.

पहली इमेज. गहरे रंग वाली थीम.

गहरे रंग वाली थीम, Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन पर उपलब्ध है. इसके ये फ़ायदे हैं:

  • डिवाइस की स्क्रीन टेक्नोलॉजी के आधार पर, बैटरी की खपत काफ़ी कम हो जाती है.
  • कमज़ोर दृष्टि और चमकदार रोशनी के प्रति संवेदनशील उपयोगकर्ताओं को देखने में आसानी होती है.
  • इससे कम रोशनी वाली जगहों पर डिवाइस इस्तेमाल करना आसान हो जाता है.

गहरे रंग वाली थीम, Android सिस्टम के यूज़र इंटरफ़ेस (यूआई) और डिवाइस पर चलने वाले ऐप्लिकेशन पर लागू होती है.

Android 10 और उसके बाद के वर्शन में, गहरे रंग वाली थीम चालू करने के तीन तरीके हैं:

  • गहरे रंग वाली थीम चालू करने के लिए, सेटिंग > डिसप्ले > थीम पर जाकर, सिस्टम सेटिंग का इस्तेमाल करें.
  • अगर क्विक सेटिंग टाइल चालू है, तो सूचना ट्रे से थीम स्विच करने के लिए इसका इस्तेमाल करें.
  • Pixel डिवाइसों पर, गहरे रंग वाली थीम चालू करने के लिए, बैटरी सेवर मोड चालू करें. ऐसा हो सकता है कि दूसरे डिवाइसों पर यह तरीका काम न करे.

वेबव्यू कॉम्पोनेंट का इस्तेमाल करके, वेब-आधारित कॉन्टेंट पर गहरे रंग वाली थीम लागू करने के निर्देशों के लिए, वेबव्यू में वेब कॉन्टेंट को गहरे रंग में दिखाना लेख पढ़ें.

अपने ऐप्लिकेशन में गहरे रंग वाली थीम का इस्तेमाल करना

गहरे रंग वाली थीम का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन की थीम को DayNight थीम से इनहेरिट करने के लिए सेट करें. आम तौर पर, यह थीम res/values/styles.xml में मिलती है:

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

Material Components की गहरे रंग वाली थीम का इस्तेमाल भी किया जा सकता है:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

इससे, ऐप्लिकेशन की मुख्य थीम को सिस्टम से कंट्रोल किए जाने वाले नाइट मोड फ़्लैग से जोड़ा जाता है. साथ ही, नाइट मोड चालू होने पर ऐप्लिकेशन को डिफ़ॉल्ट रूप से गहरे रंग वाली थीम मिलती है.

थीम और स्टाइल

हार्डकोड किए गए रंगों या ऐसे आइकॉन का इस्तेमाल करने से बचें जो हल्की थीम के साथ इस्तेमाल किए जाने के लिए हैं. इसके बजाय, थीम एट्रिब्यूट या रात में काम करने वाले संसाधनों का इस्तेमाल करें.

डार्क थीम के लिए, थीम के दो एट्रिब्यूट सबसे ज़्यादा अहम होते हैं:

  • ?android:attr/textColorPrimary: सामान्य तौर पर इस्तेमाल होने वाला टेक्स्ट का रंग. यह हल्के रंग वाली थीम में काले रंग के करीब और गहरे रंग वाली थीम में सफ़ेद रंग के करीब होता है. इसमें 'बंद है' स्थिति शामिल है.
  • ?attr/colorControlNormal: सामान्य तौर पर इस्तेमाल होने वाले आइकॉन का रंग. इसमें 'बंद है' स्थिति शामिल है.

हमारा सुझाव है कि आप Material Design के कॉम्पोनेंट इस्तेमाल करें. इसकी वजह यह है कि इसके रंग थीम करने वाले सिस्टम, जैसे कि थीम एट्रिब्यूट ?attr/colorSurface और ?attr/colorOnSurface की मदद से, सही रंगों को आसानी से ऐक्सेस किया जा सकता है. अपनी थीम में इन एट्रिब्यूट को पसंद के मुताबिक बनाया जा सकता है.

ऐप्लिकेशन में थीम बदलना

ऐप्लिकेशन के चलने के दौरान, उपयोगकर्ताओं को ऐप्लिकेशन की थीम बदलने की अनुमति दी जा सकती है. यहां दिए गए विकल्पों का सुझाव दिया जाता है:

  • हल्का
  • गहरे रंग वाली थीम
  • सिस्टम डिफ़ॉल्ट (सुझाया गया डिफ़ॉल्ट विकल्प)

ये विकल्प सीधे AppCompat.DayNight मोड पर मैप होते हैं:

थीम बदलने के लिए, यह तरीका अपनाएं:

  • एपीआई लेवल 31 और उसके बाद के वर्शन पर, UiModeManager#setApplicationNightMode का इस्तेमाल करके सिस्टम को बताएं कि आपका ऐप्लिकेशन किस थीम पर काम करता है. इससे सिस्टम, स्प्लैश स्क्रीन के दौरान थीम से मैच कर पाता है.

  • एपीआई लेवल 30 और उससे पहले के लेवल पर, थीम स्विच करने के लिए, AppCompatDelegate.setDefaultNightMode() का इस्तेमाल करें.

गहरे रंग वाली थीम को तुरंत लागू करने की सुविधा

Android 10 में गहरे रंग वाली थीम को ज़बरदस्ती लागू करने की सुविधा उपलब्ध है. इसकी मदद से, डेवलपर DayNight थीम को साफ़ तौर पर सेट किए बिना, गहरे रंग वाली थीम को तुरंत लागू कर सकते हैं.

गहरे रंग वाली थीम को जबरन लागू करने की सुविधा, हल्के रंग वाली थीम वाले ऐप्लिकेशन के हर व्यू का विश्लेषण करती है. साथ ही, स्क्रीन पर दिखने से पहले ही गहरे रंग वाली थीम को अपने-आप लागू कर देती है. गहरे रंग वाली थीम को लागू करने में लगने वाले समय को कम करने के लिए, फ़ोर्स डार्क और नेटिव लागू करने के मिले-जुले तरीकों का इस्तेमाल किया जा सकता है.

ऐप्लिकेशन को गहरे रंग वाली थीम को ज़बरदस्ती लागू करने की सुविधा के लिए ऑप्ट-इन करना होगा. इसके लिए, गतिविधि की थीम में android:forceDarkAllowed="true" को सेट करें. यह एट्रिब्यूट, सिस्टम और AndroidX की दी गई सभी लाइट थीम पर सेट होता है. जैसे, Theme.Material.Light. गहरे रंग वाली थीम को ज़बरदस्ती चालू करने की सुविधा का इस्तेमाल करते समय, अपने ऐप्लिकेशन की अच्छी तरह से जांच करें और ज़रूरत के हिसाब से व्यू हटाएं.

अगर आपका ऐप्लिकेशन गहरे रंग वाली थीम का इस्तेमाल करता है, जैसे कि Theme.Material), तो 'गहरे रंग वाली थीम को ज़बरदस्ती लागू करें' सुविधा काम नहीं करती. इसी तरह, अगर आपके ऐप्लिकेशन की थीम किसी DayNight थीम से इनहेरिट की गई है, तो थीम अपने-आप स्विच होने की वजह से, गहरे रंग वाली थीम को फ़ोर्स नहीं किया जाता.

किसी व्यू पर डार्क मोड को ज़बरदस्ती लागू करने की सुविधा बंद करना

android:forceDarkAllowed लेआउट एट्रिब्यूट या setForceDarkAllowed() की मदद से, किसी खास व्यू पर फ़ोर्स डार्क मोड को कंट्रोल किया जा सकता है.

वेब कॉन्टेंट

वेब-आधारित कॉन्टेंट में गहरे रंग वाली थीम इस्तेमाल करने के बारे में जानने के लिए, वेबव्यू में वेब कॉन्टेंट को गहरे रंग में दिखाना लेख पढ़ें. वेबव्यू पर डार्क थीम लागू करने का उदाहरण देखने के लिए, GitHub पर वेबव्यू का डेमो देखें .

सबसे सही तरीके

यहां दिए गए सेक्शन में, डार्क थीम लागू करने के सबसे सही तरीके बताए गए हैं.

सूचनाएं और विजेट

डिवाइस पर दिखाए जाने वाले उन यूज़र इंटरफ़ेस (यूआई) के लिए जिन पर आपका सीधा कंट्रोल नहीं होता, पक्का करें कि इस्तेमाल किए जाने वाले सभी व्यू में होस्ट ऐप्लिकेशन की थीम दिखे. उदाहरण के लिए, सूचनाएं और लॉन्चर विजेट.

सूचनाएं

सिस्टम से मिले सूचना टेंप्लेट का इस्तेमाल करें, जैसे कि MessagingStyle. इसका मतलब है कि व्यू की सही स्टाइल लागू करने की ज़िम्मेदारी सिस्टम की है.

विजेट और कस्टम सूचना व्यू

अगर आपका ऐप्लिकेशन, सूचना के कॉन्टेंट के कस्टम व्यू का इस्तेमाल करता है या लॉन्चर विजेट के लिए, कॉन्टेंट की जांच लाइट और डार्क, दोनों थीम में करें.

इन सामान्य समस्याओं से बचना चाहिए:

  • यह मानते हुए कि बैकग्राउंड का रंग हमेशा हल्का होता है.
  • टेक्स्ट के रंग को हार्डकोड करना.
  • डिफ़ॉल्ट टेक्स्ट कलर का इस्तेमाल करते समय, हार्डकोड किया गया बैकग्राउंड कलर सेट करना.
  • ड्रॉ किए जा सकने वाले ऐसे आइकॉन का इस्तेमाल करना जो स्टैटिक रंग का हो.

इन सभी मामलों में, हार्डकोड किए गए रंगों के बजाय, थीम के लिए सही एट्रिब्यूट का इस्तेमाल करें.

लॉन्च स्क्रीन

अगर आपके ऐप्लिकेशन में कस्टम लॉन्च स्क्रीन है, तो आपको उसमें बदलाव करना पड़ सकता है, ताकि वह चुनी गई थीम को दिखा सके.

हार्डकोड किए गए सभी रंग हटाएं. जैसे, प्रोग्राम के हिसाब से सफ़ेद पर सेट किए गए बैकग्राउंड के रंग. इसके बजाय, ?android:attr/colorBackground थीम एट्रिब्यूट का इस्तेमाल करें.

कॉन्फ़िगरेशन में बदलाव

जब सिस्टम सेटिंग या AppCompat की मदद से ऐप्लिकेशन की थीम बदलती है, तो इससे uiMode कॉन्फ़िगरेशन में बदलाव होता है. इसका मतलब है कि गतिविधियां अपने-आप फिर से बन जाती हैं.

कुछ मामलों में, हो सकता है कि आप किसी ऐप्लिकेशन को कॉन्फ़िगरेशन में हुए बदलाव को मैनेज करने के लिए कहें. उदाहरण के लिए, हो सकता है कि कोई वीडियो चल रहा हो और आप कॉन्फ़िगरेशन में बदलाव करने से पहले कुछ समय इंतज़ार करना चाहें.

कोई ऐप्लिकेशन, गहरे रंग वाली थीम को लागू करने की सुविधा को मैनेज कर सकता है. इसके लिए, यह एलान करना ज़रूरी है कि हर Activity, uiMode कॉन्फ़िगरेशन में बदलाव कर सकता है:

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />

जब कोई Activity यह एलान करता है कि वह कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करता है, तो थीम में बदलाव होने पर उसके onConfigurationChanged()method को कॉल किया जाता है.

यह देखने के लिए कि मौजूदा थीम क्या है, ऐप्लिकेशन इस तरह का कोड चला सकते हैं:

Kotlin

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme.
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme.
}

Java

int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}