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

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

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

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

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

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

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

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

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

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

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

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

मटीरियल कॉम्पोनेंट गहरे रंग वाली थीम का भी इस्तेमाल किया जा सकता है:

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