उन अतिरिक्त फ़ाइलों और स्टैटिक कॉन्टेंट को रिसॉर्स कहते हैं जो आपका कोड इस्तेमाल करता है. जैसे, बिटमैप, यूज़र इंटरफ़ेस स्ट्रिंग, ऐनिमेशन के निर्देश वगैरह.
ऐप्लिकेशन के संसाधनों, जैसे कि इमेज और स्ट्रिंग को हमेशा अपने कोड से अलग रखें, ताकि उन्हें अलग से मैनेज किया जा सके. साथ ही, खास डिवाइस कॉन्फ़िगरेशन के लिए वैकल्पिक संसाधन उपलब्ध कराएं. इसके लिए, उन्हें खास नाम वाली संसाधन डायरेक्ट्री में ग्रुप करें. रनटाइम के दौरान, Android मौजूदा कॉन्फ़िगरेशन के आधार पर सही संसाधन का इस्तेमाल करता है. उदाहरण के लिए, भाषा की सेटिंग के हिसाब से अलग-अलग स्ट्रिंग दी जा सकती हैं.
अपने ऐप्लिकेशन के संसाधनों को बाहरी बनाने के बाद, उन्हें ऐक्सेस किया जा सकता है. इसके लिए, आपको अपने प्रोजेक्ट की R क्लास में जनरेट हुए संसाधन आईडी का इस्तेमाल करना होगा.
इस दस्तावेज़ में, Android प्रोजेक्ट में संसाधनों को ग्रुप करने का तरीका बताया गया है. इसमें यह भी बताया गया है कि डिवाइस के खास कॉन्फ़िगरेशन के लिए, वैकल्पिक संसाधन कैसे उपलब्ध कराए जाएं. साथ ही, उन्हें अपने ऐप्लिकेशन कोड या अन्य एक्सएमएल फ़ाइलों से कैसे ऐक्सेस किया जाए.
ग्रुप किए गए संसाधन टाइप
हर तरह के संसाधन को अपने प्रोजेक्ट की res/ डायरेक्ट्री की किसी खास सबडायरेक्ट्री में रखें. उदाहरण के लिए, यहां एक सामान्य प्रोजेक्ट के लिए फ़ाइल का क्रम दिया गया है:
MyProject/
src/
MyActivity.kt
res/
drawable/
graphic.png
mipmap/
icon.png
values/
strings.xml
res/ डायरेक्ट्री में, इसकी सबडायरेक्ट्री में मौजूद सभी संसाधन शामिल होते हैं: एक इमेज रिसॉर्स, लॉन्चर आइकॉन के लिए mipmap/ डायरेक्ट्री, और एक स्ट्रिंग रिसॉर्स फ़ाइल. संसाधन डायरेक्ट्री के नाम ज़रूरी हैं. इनके बारे में टेबल 1 में बताया गया है.
ध्यान दें: मिपमैप फ़ोल्डर इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन के आइकॉन को मिपमैप डायरेक्ट्री में रखें लेख पढ़ें.
पहली टेबल. प्रोजेक्ट res/ डायरेक्ट्री में काम करने वाली रिसॉर्स डायरेक्ट्री.
| डायरेक्ट्री | संसाधन का टाइप |
|---|---|
drawable/ |
बिटमैप फ़ाइलें (PNG,
ज़्यादा जानकारी के लिए, ड्रॉएबल रिसॉर्स देखें. |
mipmap/ |
अलग-अलग लॉन्चर आइकॉन डेंसिटी के लिए ड्रॉएबल फ़ाइलें. mipmap/ फ़ोल्डर की मदद से लॉन्चर आइकॉन मैनेज करने के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन आइकॉन को मिपमैप डायरेक्ट्री में रखना लेख पढ़ें. |
raw/ |
फ़ाइलों को उनके रॉ फ़ॉर्म में सेव करने के लिए. इन संसाधनों को रॉ हालांकि, अगर आपको ओरिजनल फ़ाइल के नाम और फ़ाइल के क्रम का ऐक्सेस चाहिए, तो |
values/ |
ऐसी एक्सएमएल फ़ाइलें जिनमें स्ट्रिंग, पूर्णांक, और रंग जैसी सामान्य वैल्यू शामिल होती हैं. वहीं, अन्य हर संसाधन को उसके अपने एक्सएमएल एलिमेंट के साथ तय किया जाता है. इसलिए, फ़ाइल का नाम अपनी पसंद के हिसाब से रखा जा सकता है. साथ ही, एक ही फ़ाइल में अलग-अलग तरह के संसाधन रखे जा सकते हैं. हालांकि, बेहतर तरीके से समझने के लिए, अलग-अलग फ़ाइलों में यूनीक रिसॉर्स टाइप रखे जा सकते हैं. उदाहरण के लिए, इस डायरेक्ट्री में बनाई जा सकने वाली फ़ाइलों के नाम रखने के कुछ नियम यहां दिए गए हैं:
ज़्यादा जानकारी के लिए, स्ट्रिंग रिसॉर्स, स्टाइल रिसॉर्स, और अन्य रिसॉर्स टाइप देखें. |
xml/ |
ऐसी कोई भी एक्सएमएल फ़ाइल जिसे रनटाइम के दौरान Resources.getXML को कॉल करके पढ़ा जा सकता है. अलग-अलग XML कॉन्फ़िगरेशन फ़ाइलों को यहां सेव करना ज़रूरी है.
|
font/ |
TTF, OTF या TTC जैसे एक्सटेंशन वाली फ़ॉन्ट फ़ाइलें या ऐसी एक्सएमएल फ़ाइलें जिनमें <font-family> एलिमेंट शामिल हो. संसाधन के तौर पर फ़ॉन्ट के बारे में ज़्यादा जानने के लिए, एक्सएमएल संसाधन के तौर पर फ़ॉन्ट जोड़ना लेख पढ़ें.
|
चेतावनी: संसाधन फ़ाइलों को सीधे तौर पर कभी भी res/ डायरेक्ट्री में सेव न करें. इससे कंपाइलर से जुड़ी गड़बड़ी होती है.
टेबल 1 में बताई गई सबडाइरेक्ट्री में सेव किए गए संसाधन, आपके डिफ़ॉल्ट संसाधन होते हैं. इसका मतलब है कि ये संसाधन, आपके ऐप्लिकेशन के लिए डिफ़ॉल्ट डिज़ाइन और कॉन्टेंट तय करते हैं. हालांकि, Android पर काम करने वाले अलग-अलग तरह के डिवाइसों के लिए, अलग-अलग तरह के संसाधनों की ज़रूरत पड़ सकती है.
उदाहरण के लिए, डिवाइस की भाषा की सेटिंग के आधार पर, यूज़र इंटरफ़ेस में मौजूद टेक्स्ट का अनुवाद करने के लिए, अलग-अलग स्ट्रिंग संसाधन उपलब्ध कराए जा सकते हैं.
ध्यान दें: Compose में, यूज़र इंटरफ़ेस (यूआई), ऐनिमेशन, और स्टेट-ड्रिवन कलर को Kotlin में एलान किया जाता है. इसलिए, layout/, menu/, anim/, animator/, और color/ डायरेक्ट्री, आधुनिक ऐप्लिकेशन के लिए पुरानी हो चुकी हैं. ज़्यादा जानकारी के लिए, Compose में ऐनिमेशन और Compose में थीम की संरचना देखें.
वैकल्पिक रिसॉर्स उपलब्ध कराना
ज़्यादातर ऐप्लिकेशन, डिवाइस के खास कॉन्फ़िगरेशन के साथ काम करने के लिए, वैकल्पिक संसाधन उपलब्ध कराते हैं. उदाहरण के लिए, अलग-अलग स्क्रीन डेंसिटी के लिए वैकल्पिक ड्रॉएबल संसाधन और अलग-अलग भाषाओं के लिए वैकल्पिक स्ट्रिंग संसाधन शामिल करें. रनटाइम के दौरान, Android मौजूदा डिवाइस कॉन्फ़िगरेशन का पता लगाता है और आपके ऐप्लिकेशन के लिए सही संसाधन लोड करता है.
संसाधनों के किसी सेट के लिए, कॉन्फ़िगरेशन के हिसाब से विकल्प तय करने के लिए, यह तरीका अपनाएं:
res/में एक नई डायरेक्ट्री बनाएं. इसका नाम<resources_name>-<qualifier>के फ़ॉर्म में होना चाहिए.<resources_name>, टेबल 1 में तय किए गए डिफ़ॉल्ट संसाधनों के डायरेक्ट्री का नाम है.<qualifier>एक ऐसा नाम है जो किसी कॉन्फ़िगरेशन के बारे में बताता है. इस कॉन्फ़िगरेशन के लिए, इन संसाधनों का इस्तेमाल किया जाना है. इसे टेबल 2 में बताया गया है.
एक से ज़्यादा
<qualifier>जोड़े जा सकते हैं. हर एक को डैश से अलग करें.चेतावनी: एक से ज़्यादा क्वालिफ़ायर जोड़ते समय, आपको उन्हें उसी क्रम में रखना होगा जिस क्रम में वे टेबल 2 में दिए गए हैं. अगर क्वालिफ़ायर को गलत क्रम में रखा गया है, तो संसाधनों को अनदेखा कर दिया जाता है.
- इस नई डायरेक्ट्री में, सही वैकल्पिक संसाधन सेव करें. संसाधन फ़ाइलों के नाम, डिफ़ॉल्ट संसाधन फ़ाइलों के नाम से पूरी तरह मेल खाने चाहिए.
उदाहरण के लिए, यहां कुछ डिफ़ॉल्ट और वैकल्पिक संसाधन दिए गए हैं:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi क्वालिफ़ायर से पता चलता है कि उस डायरेक्ट्री में मौजूद संसाधन, ज़्यादा पिक्सल डेंसिटी वाली स्क्रीन वाले डिवाइसों के लिए हैं. इन ड्रॉएबल डायरेक्ट्री में मौजूद इमेज, स्क्रीन की खास डेंसिटी के हिसाब से साइज़ की जाती हैं. हालांकि, फ़ाइलों के नाम एक जैसे होते हैं. इस तरह, icon.png या background.png इमेज का रेफ़रंस देने के लिए इस्तेमाल किया गया रिसॉर्स आईडी हमेशा एक ही रहता है. Android, हर संसाधन के उस वर्शन को चुनता है जो मौजूदा डिवाइस के साथ सबसे अच्छी तरह काम करता है. इसके लिए, वह डिवाइस के कॉन्फ़िगरेशन की जानकारी की तुलना, संसाधन डायरेक्ट्री के नाम में मौजूद क्वालिफ़ायर से करता है.
चेतावनी: किसी वैकल्पिक संसाधन को तय करते समय, पक्का करें कि आपने डिफ़ॉल्ट कॉन्फ़िगरेशन में भी संसाधन तय किया हो. ऐसा न करने पर, डिवाइस के कॉन्फ़िगरेशन में बदलाव होने पर, आपके ऐप्लिकेशन को रनटाइम अपवादों का सामना करना पड़ सकता है. उदाहरण के लिए, अगर आपने किसी स्ट्रिंग को सिर्फ़ values-en में जोड़ा है और values में नहीं, तो हो सकता है कि जब उपयोगकर्ता सिस्टम की डिफ़ॉल्ट भाषा बदले, तब आपके ऐप्लिकेशन में Resource Not Found अपवाद दिखे.
दूसरी टेबल में, कॉन्फ़िगरेशन क्वालिफ़ायर को प्राथमिकता के क्रम में दिखाया गया है. एक डायरेक्ट्री के नाम में एक से ज़्यादा क्वालिफ़ायर जोड़े जा सकते हैं. इसके लिए, हर क्वालिफ़ायर को डैश से अलग करें. अगर किसी संसाधन डायरेक्ट्री के लिए एक से ज़्यादा क्वालिफ़ायर इस्तेमाल किए जाते हैं, तो आपको उन्हें डायरेक्ट्री के नाम में उसी क्रम में जोड़ना होगा जिस क्रम में वे टेबल में दिए गए हैं.
टेबल 2. कॉन्फ़िगरेशन क्वालिफ़ायर के नाम.
| कॉन्फ़िगरेशन | क्वालिफ़ायर वैल्यू | ब्यौरा |
|---|---|---|
| एमसीसी और एमएनसी | उदाहरण:mcc310mcc208-mnc00
|
डिवाइस में मौजूद सिम कार्ड से मिला मोबाइल कंट्री कोड (एमसीसी). इसके बाद, मोबाइल नेटवर्क कोड (एमएनसी) भी मिल सकता है. उदाहरण के लिए, अगर डिवाइस रेडियो कनेक्शन का इस्तेमाल करता है (यानी कि यह जीएसएम फ़ोन है), तो एमसीसी और एमएनसी की वैल्यू, सिम कार्ड से मिलती हैं. सिर्फ़ एमसीसी का इस्तेमाल भी किया जा सकता है. उदाहरण के लिए, अपने ऐप्लिकेशन में देश के हिसाब से कानूनी संसाधन शामिल करने के लिए. अगर आपको सिर्फ़ भाषा के आधार पर जानकारी देनी है, तो भाषा, स्क्रिप्ट (ज़रूरी नहीं), और क्षेत्र (ज़रूरी नहीं) क्वालिफ़ायर का इस्तेमाल करें. अगर एमसीसी और एमएनसी क्वालिफ़ायर का इस्तेमाल किया जाता है, तो सावधानी बरतें और जांच करें कि यह उम्मीद के मुताबिक काम कर रहा है. कॉन्फ़िगरेशन फ़ील्ड |
| भाषा, स्क्रिप्ट (ज़रूरी नहीं), और क्षेत्र (ज़रूरी नहीं) | उदाहरण:enfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS |
भाषा को दो अक्षरों वाले ISO 639-1 भाषा कोड से तय किया जाता है. इसके बाद, दो अक्षरों वाले ISO 3166-1-ऐल्फ़ा-2 क्षेत्र कोड (इससे पहले छोटे अक्षरों वाला कोड, केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) नहीं होते हैं. Android 7.0 (एपीआई लेवल 24) में, BCP 47 भाषा के टैग इस्तेमाल करने की सुविधा जोड़ी गई है. इनका इस्तेमाल, भाषा और इलाके के हिसाब से उपलब्ध संसाधनों को बेहतर बनाने के लिए किया जा सकता है. भाषा टैग, एक या उससे ज़्यादा सबटैग के क्रम से बना होता है. इनमें से हर सबटैग, पूरे टैग से पहचानी गई भाषा की रेंज को बेहतर बनाता है या कम करता है. भाषा के टैग के बारे में ज़्यादा जानकारी के लिए, भाषाओं की पहचान करने वाले टैग लेख पढ़ें. BCP 47 भाषा टैग का इस्तेमाल करने के लिए, अगर उपयोगकर्ता सिस्टम की सेटिंग में जाकर भाषा बदलते हैं, तो आपके ऐप्लिकेशन के लिए भाषा टैग बदल सकता है. इस बारे में जानकारी पाने के लिए कि रनटाइम के दौरान, इससे आपके ऐप्लिकेशन पर क्या असर पड़ सकता है, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें. अपने ऐप्लिकेशन को अन्य भाषाओं के लिए स्थानीय भाषा के मुताबिक बनाने के बारे में पूरी जानकारी पाने के लिए, अपने ऐप्लिकेशन को स्थानीय भाषा के मुताबिक बनाएं लेख पढ़ें. इसके अलावा, |
| व्याकरण के हिसाब से लिंग | masculinefeminineneuter |
उपयोगकर्ता का व्याकरण के हिसाब से लिंग. इसका इस्तेमाल उन भाषाओं के लिए किया जाता है जिनमें व्याकरण के हिसाब से लिंग होता है. उदाहरण के लिए, अगर आपको फ़्रेंच बोलने वाले लोगों के लिए अलग-अलग संसाधन उपलब्ध कराने हैं, तो यहां दी गई डायरेक्ट्री का इस्तेमाल किया जा सकता है:
इसे एपीआई लेवल 34 में जोड़ा गया है. |
| वाइड कलर गैमट |
widecgnowidecg
|
इसे एपीआई लेवल 26 में जोड़ा गया है.
|
| हाई डाइनैमिक रेंज (एचडीआर) |
highdrlowdr
|
इसे एपीआई लेवल 26 में जोड़ा गया है.
|
| यूज़र इंटरफ़ेस (यूआई) मोड |
cardesktelevisionappliancewatchvrheadset
|
एपीआई लेवल 8 में जोड़ा गया; टेलीविज़न को एपीआई 13 में जोड़ा गया; डिवाइस को एपीआई 16 में जोड़ा गया; घड़ी को एपीआई 20 में जोड़ा गया; वीआर हेडसेट को एपीआई 26 में जोड़ा गया. डिवाइस को डॉक में लगाने या निकालने पर, आपका ऐप्लिकेशन कैसे जवाब दे सकता है, इस बारे में जानकारी पाने के लिए, डॉक करने की स्थिति और टाइप का पता लगाना और उसकी निगरानी करना लेख पढ़ें. अगर उपयोगकर्ता डिवाइस को डॉक में रखता है, तो आपके ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. |
| नाइट मोड |
nightnotnight
|
इसे एपीआई लेवल 8 में जोड़ा गया था. अगर नाइट मोड को ऑटो मोड (डिफ़ॉल्ट) पर सेट किया जाता है, तो ऐप्लिकेशन के इस्तेमाल के दौरान यह बदल सकता है. ऐसा इसलिए, क्योंकि दिन के समय के हिसाब से मोड बदलता है. |
| स्क्रीन पिक्सल डेंसिटी (डीपीआई) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
छह प्राइमरी डेंसिटी (tvdpi डेंसिटी को छोड़कर) के बीच, 3:4:6:8:12:16 का स्केलिंग रेशियो होता है. इसलिए, ldpi में 9x9 बिटमैप, mdpi में 12x12, hdpi में 18x18, xhdpi में 24x24 वगैरह होता है. ध्यान दें: डेंसिटी क्वालिफ़ायर का इस्तेमाल करने का मतलब यह नहीं है कि संसाधन, उस डेंसिटी वाली स्क्रीन के लिए सिर्फ़ हैं. अगर आपने क्वालिफ़ायर के साथ ऐसे वैकल्पिक संसाधन उपलब्ध नहीं कराए हैं जो डिवाइस के मौजूदा कॉन्फ़िगरेशन से बेहतर तरीके से मेल खाते हैं, तो सिस्टम उन संसाधनों का इस्तेमाल करेगा जो सबसे ज़्यादा मेल खाते हैं. अलग-अलग स्क्रीन डेंसिटी को मैनेज करने और Android, मौजूदा डेंसिटी के हिसाब से आपके बिटमैप को कैसे स्केल कर सकता है, इस बारे में ज़्यादा जानने के लिए स्क्रीन कंपैटिबिलिटी की खास जानकारी देखें. |
| टचस्क्रीन का टाइप |
notouchfinger
|
|
| कीबोर्ड उपलब्ध है या नहीं |
keysexposedkeyshiddenkeyssoft
|
अगर आपने अगर उपयोगकर्ता हार्डवेयर कीबोर्ड खोलता है, तो ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. इसकी वजह से, रनटाइम के दौरान आपके ऐप्लिकेशन पर क्या असर पड़ता है, इस बारे में जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें. इसके अलावा, कॉन्फ़िगरेशन फ़ील्ड |
| टेक्स्ट डालने का मुख्य तरीका |
nokeysqwerty12key
|
|
| नेविगेशन की उपलब्धता |
navexposednavhidden
|
अगर उपयोगकर्ता नेविगेशन कुंजियां दिखाता है, तो ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. इसकी वजह से, रनटाइम के दौरान आपके ऐप्लिकेशन पर क्या असर पड़ता है, इस बारे में जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें.
|
| बिना टच किए नेविगेट करने का मुख्य तरीका |
nonavdpadtrackballwheel
|
|
| प्लैटफ़ॉर्म वर्शन (एपीआई लेवल) | उदाहरण:v3v4v7वगैरह. |
डिवाइस पर काम करने वाला एपीआई लेवल. उदाहरण के लिए, एपीआई लेवल 1 (Android 1.0 या इसके बाद के वर्शन वाले डिवाइस) के लिए |
ध्यान दें: Android के सभी वर्शन में, सभी क्वालिफ़ायर काम नहीं करते. नए क्वालिफ़ायर का इस्तेमाल करने पर, प्लैटफ़ॉर्म वर्शन क्वालिफ़ायर अपने-आप जुड़ जाता है. इससे पुराने डिवाइस इसे अनदेखा कर सकते हैं. किसी भी समस्या से बचने के लिए, हमेशा डिफ़ॉल्ट संसाधनों का एक सेट शामिल करें. यह बिना क्वालिफ़ायर वाले संसाधनों का एक सेट होता है. ज़्यादा जानकारी के लिए, संसाधनों के साथ डिवाइस के सबसे सही तरीके से काम करने के बारे में जानकारी देने वाला सेक्शन देखें.
Compose ऐप्लिकेशन में, लेआउट और डाइमेंशन से जुड़े कॉन्फ़िगरेशन क्वालिफ़ायर की ज़रूरत नहीं होती. ये अब भी मौजूद हैं, लेकिन इन्हें टेबल 2 में शामिल नहीं किया गया है. इन क्वालिफ़ायर में ये शामिल हैं: लेआउट की दिशा, सबसे कम चौड़ाई, उपलब्ध चौड़ाई, उपलब्ध ऊंचाई, स्क्रीन का साइज़, स्क्रीन का आसपेक्ट रेशियो, गोल स्क्रीन, और स्क्रीन का ओरिएंटेशन. प्राथमिकता के क्रम में कॉन्फ़िगरेशन क्वालिफ़ायर की पूरी टेबल देखने के लिए, ऐप्लिकेशन के संसाधनों की खास जानकारी (व्यू) देखें.
क्वालिफ़ायर के नाम से जुड़े नियम
कॉन्फ़िगरेशन क्वालिफ़ायर के नामों का इस्तेमाल करने के बारे में कुछ नियम यहां दिए गए हैं:
- संसाधनों के एक सेट के लिए, डैश से अलग किए गए कई क्वालिफ़ायर तय किए जा सकते हैं. उदाहरण के लिए,
drawable-en-rUS-nightअमेरिका में अंग्रेज़ी भाषा के लिए सेट किए गए डिवाइसों पर नाइट मोड में लागू होता है. - क्वालिफ़ायर, टेबल 2 में दिए गए क्रम में होने चाहिए.
- गलत:
drawable-hdpi-night/ - सही:
drawable-night-hdpi/
- गलत:
- वैकल्पिक संसाधन डायरेक्ट्री को नेस्ट नहीं किया जा सकता. उदाहरण के लिए,
res/drawable/drawable-en/का इस्तेमाल नहीं किया जा सकता. - वैल्यू, केस-इनसेंसिटिव होती हैं. संसाधन कंपाइलर, डायरेक्ट्री के नामों को प्रोसेस करने से पहले उन्हें छोटे अक्षरों में बदल देता है. ऐसा इसलिए किया जाता है, ताकि केस-इनसेंसिटिव फ़ाइल सिस्टम में समस्याएं न आएं. नामों में कैपिटल लेटर का इस्तेमाल सिर्फ़ इसलिए किया गया है, ताकि उन्हें आसानी से पढ़ा जा सके.
- हर क्वालिफ़ायर टाइप के लिए, सिर्फ़ एक वैल्यू इस्तेमाल की जा सकती है. उदाहरण के लिए, अगर आपको स्पेन और फ़्रांस के लिए एक ही ड्रॉएबल फ़ाइलों का इस्तेमाल करना है, तो आपके पास
drawable-es-fr/नाम की डायरेक्ट्री नहीं हो सकती. इसके बजाय, आपको दो रिसॉर्स डायरेक्ट्री की ज़रूरत होती है. जैसे,drawable-es/औरdrawable-fr/. इनमें सही फ़ाइलें होती हैं.
इन क्वालिफ़ायर के नाम वाली डायरेक्ट्री में वैकल्पिक संसाधन सेव करने के बाद, Android आपके ऐप्लिकेशन में मौजूद संसाधनों को डिवाइस के मौजूदा कॉन्फ़िगरेशन के आधार पर अपने-आप लागू कर देता है. जब भी किसी संसाधन का अनुरोध किया जाता है, तब Android, संसाधन फ़ाइल वाली अन्य डायरेक्ट्री की जांच करता है. इसके बाद, सबसे मिलती-जुलती संसाधन फ़ाइल ढूंढता है.
अगर किसी डिवाइस कॉन्फ़िगरेशन से मेल खाने वाले कोई अन्य संसाधन नहीं हैं, तो Android उससे जुड़े डिफ़ॉल्ट संसाधनों का इस्तेमाल करता है. ये किसी संसाधन टाइप के लिए संसाधनों का ऐसा सेट होता है जिसमें कॉन्फ़िगरेशन क्वालिफ़ायर शामिल नहीं होता.
उपनाम वाले संसाधन बनाना
अगर आपको किसी संसाधन का इस्तेमाल एक से ज़्यादा डिवाइस कॉन्फ़िगरेशन के लिए करना है, लेकिन उसे डिफ़ॉल्ट संसाधन के तौर पर उपलब्ध नहीं कराना है, तो आपको एक ही संसाधन को एक से ज़्यादा वैकल्पिक संसाधन डायरेक्ट्री में रखने की ज़रूरत नहीं है. इसके बजाय, कोई वैकल्पिक संसाधन बनाया जा सकता है. यह संसाधन, आपकी डिफ़ॉल्ट संसाधन डायरेक्ट्री में सेव किए गए संसाधन के लिए एलियास के तौर पर काम करता है.
ड्रॉएबल
उदाहरण के लिए, मान लें कि आपके पास एक ऐप्लिकेशन आइकॉन, icon.png है और आपको अलग-अलग स्थान-भाषाओं के लिए इसका यूनीक वर्शन चाहिए. हालांकि, अंग्रेज़ी-कैनडियन और फ़्रेंच-कैनडियन, दोनों स्थान-भाषाओं के लिए एक ही वर्शन का इस्तेमाल करना ज़रूरी है. आपको अंग्रेज़ी-कनाडा और फ़्रेंच-कनाडा, दोनों के लिए संसाधन डायरेक्ट्री में एक ही इमेज को कॉपी करने की ज़रूरत नहीं है.
इसके बजाय, दोनों के लिए इस्तेमाल की गई इमेज को icon.png के अलावा किसी भी नाम से सेव किया जा सकता है. जैसे, icon_ca.png. इसके बाद, इसे डिफ़ॉल्ट res/drawable/ डायरेक्ट्री में रखा जा सकता है. इसके बाद, res/drawable-en-rCA/ और res/drawable-fr-rCA/ में icon.xml फ़ाइल बनाएं. यह फ़ाइल, <bitmap> एलिमेंट का इस्तेमाल करके icon_ca.png रिसोर्स को रेफ़र करती है.
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
इससे, PNG फ़ाइल का सिर्फ़ एक वर्शन और दो छोटी एक्सएमएल फ़ाइलें सेव की जा सकती हैं. ये फ़ाइलें, PNG फ़ाइल की ओर ले जाती हैं.
इसके बाद, painterResource(R.drawable.icon) का इस्तेमाल किया जा सकता है. सिस्टम, स्थान-भाषा का पता लगाने के बाद सही फ़ाइल चुन लेगा.
स्ट्रिंग और अन्य सामान्य वैल्यू
किसी मौजूदा स्ट्रिंग का एलियास बनाने के लिए, नई स्ट्रिंग की वैल्यू के तौर पर, अपनी पसंद की स्ट्रिंग का संसाधन आईडी इस्तेमाल करें:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
R.string.hi संसाधन अब R.string.hello का उपनाम है.
अन्य सामान्य वैल्यू भी इसी तरह काम करती हैं. जैसे, रंग:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
अपने ऐप्लिकेशन के संसाधनों को ऐक्सेस करना
अपने ऐप्लिकेशन में कोई संसाधन उपलब्ध कराने के बाद, उसके रिसॉर्स आईडी का रेफ़रंस देकर उसे लागू किया जा सकता है. सभी संसाधन आईडी, आपके प्रोजेक्ट की R क्लास में तय किए जाते हैं. aapt टूल, इन्हें अपने-आप जनरेट करता है.
जब आपका ऐप्लिकेशन कंपाइल किया जाता है, तब aapt, R क्लास जनरेट करता है. इसमें आपकी res/ डायरेक्ट्री में मौजूद सभी रिसॉर्स के लिए रिसॉर्स आईडी होते हैं. हर तरह के रिसॉर्स के लिए, एक R सबक्लास होता है. जैसे, सभी ड्रॉ किए जा सकने वाले रिसॉर्स के लिए R.drawable. साथ ही, उस टाइप के हर संसाधन के लिए, एक स्टैटिक पूर्णांक होता है. उदाहरण के लिए, R.drawable.icon. यह पूर्णांक, रिसॉर्स आईडी है. इसका इस्तेमाल करके, अपने रिसॉर्स को वापस पाया जा सकता है.
हालांकि, R क्लास में संसाधन आईडी तय किए जाते हैं, लेकिन संसाधन आईडी ढूंढने के लिए आपको वहां देखने की ज़रूरत नहीं है. किसी रिसॉर्स आईडी में हमेशा ये चीज़ें शामिल होती हैं:
- संसाधन का टाइप: हर संसाधन को "टाइप" में ग्रुप किया जाता है. जैसे,
stringयाdrawable. - संसाधन का नाम, जो कि फ़ाइल का नाम है. इसमें एक्सटेंशन शामिल नहीं होता.
Compose में संसाधनों को ऐक्सेस करना
Jetpack Compose, संसाधनों को सुरक्षित तरीके से ऐक्सेस करने के लिए, कंपोज़ेबल-अवेयर फ़ंक्शन उपलब्ध कराता है.
- स्ट्रिंग:
stringResource(id = R.string.hello)
- ड्रॉएबल:
painterResource(id = R.drawable.my_icon)
यूआई कोड के अलावा अन्य कोड में संसाधनों को ऐक्सेस करना
अगर आपको यूज़र इंटरफ़ेस (यूआई) के क्रम से बाहर के संसाधनों को ऐक्सेस करना है, जैसे कि ViewModel, Repository या सिस्टम Service में, तो Context का इस्तेमाल करके उन्हें हल किया जा सकता है.
// Retrieve a localized string resource val greeting = context.getString(R.string.hello_world)
Resources में दिए गए तरीकों का इस्तेमाल करके, अलग-अलग संसाधनों को भी वापस पाया जा सकता है. getResources का इस्तेमाल करके, आपको इसका इंस्टेंस मिल सकता है.
सिंटैक्स
कोड में किसी संसाधन का रेफ़रंस देने का सिंटैक्स यहां दिया गया है:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>उस पैकेज का नाम है जिसमें संसाधन मौजूद है. अगर आपको अपने पैकेज के संसाधनों का रेफ़रंस देना है, तो इसकी ज़रूरत नहीं है.<resource_type>, रिसॉर्स टाइप के लिएRसबक्लास है.<resource_name>, एक्सटेंशन के बिना संसाधन का फ़ाइल नाम होता है. इसके अलावा, यह एक्सएमएल एलिमेंट मेंandroid:nameएट्रिब्यूट की वैल्यू भी हो सकता है.
हर संसाधन टाइप और उन्हें रेफ़रंस करने के तरीके के बारे में ज़्यादा जानने के लिए, Compose में संसाधन देखें.
ओरिजनल फ़ाइलें ऐक्सेस करना
हालांकि, ऐसा कम ही होता है, लेकिन आपको अपनी मूल फ़ाइलों और डायरेक्ट्री को ऐक्सेस करने की ज़रूरत पड़ सकती है. अगर ऐसा है, तो res/ में फ़ाइलें सेव करने की सुविधा आपके लिए काम नहीं करेगी. इसकी वजह यह है कि res/ से किसी संसाधन को सिर्फ़ संसाधन आईडी की मदद से पढ़ा जा सकता है. इसके बजाय, अपने संसाधनों को assets/ डायरेक्ट्री में सेव किया जा सकता है.
assets/ डायरेक्ट्री में सेव की गई फ़ाइलों को रिसॉर्स आईडी नहीं दिया जाता है. इसलिए, इन्हें R क्लास या एक्सएमएल रिसॉर्स से रेफ़रंस नहीं किया जा सकता. इसके बजाय, assets/ डायरेक्ट्री में मौजूद फ़ाइलों को सामान्य फ़ाइल सिस्टम की तरह क्वेरी किया जा सकता है. साथ ही, assets/ का इस्तेमाल करके रॉ डेटा पढ़ा जा सकता है.AssetManager
हालांकि, अगर आपको सिर्फ़ रॉ डेटा (जैसे कि वीडियो या ऑडियो फ़ाइल) को पढ़ने की सुविधा चाहिए, तो फ़ाइल को res/raw/ डायरेक्ट्री में सेव करें और openRawResource का इस्तेमाल करके बाइट की स्ट्रीम पढ़ें.
प्लैटफ़ॉर्म के संसाधनों को ऐक्सेस करना
Android में कई स्टैंडर्ड संसाधन होते हैं, जैसे कि सिस्टम स्टाइल और थीम. इन्हें ऐक्सेस करने के लिए, अपने रिसॉर्स रेफ़रंस को android पैकेज क्लास के साथ क्वालिफ़ाई करें. उदाहरण के लिए:
painterResource(android.R.drawable.ic_menu_info_details).
संसाधनों के साथ डिवाइस की सबसे अच्छी कंपैटिबिलिटी उपलब्ध कराना
आपके ऐप्लिकेशन को अलग-अलग डिवाइस कॉन्फ़िगरेशन के साथ काम करने के लिए, यह बहुत ज़रूरी है कि आप अपने ऐप्लिकेशन में इस्तेमाल होने वाले हर तरह के संसाधन के लिए, डिफ़ॉल्ट संसाधन हमेशा उपलब्ध कराएं.
उदाहरण के लिए, अगर आपका ऐप्लिकेशन कई भाषाओं में काम करता है, तो हमेशा एक values/ डायरेक्ट्री शामिल करें. इसमें आपकी स्ट्रिंग सेव की जाती हैं. साथ ही, इसमें भाषा और देश/इलाके के हिसाब से क्वालिफ़ायर नहीं होना चाहिए. अगर आपने अपनी सभी स्ट्रिंग फ़ाइलों को ऐसी डायरेक्ट्री में रखा है जिनमें भाषा और देश/इलाके के हिसाब से क्वालिफ़ायर मौजूद है, तो आपके ऐप्लिकेशन के क्रैश होने की संभावना बढ़ जाती है. ऐसा तब होता है, जब ऐप्लिकेशन को किसी ऐसे डिवाइस पर चलाया जाता है जिसमें ऐसी भाषा सेट की गई हो जो आपकी स्ट्रिंग के साथ काम नहीं करती.
जब तक डिफ़ॉल्ट values/ संसाधन उपलब्ध कराए जाते हैं, तब तक आपका ऐप्लिकेशन ठीक से काम करता है. भले ही, उपयोगकर्ता को ऐप्लिकेशन में इस्तेमाल की गई भाषा समझ न आए. क्रैश होने से बेहतर है.
डिफ़ॉल्ट संसाधन उपलब्ध कराना इसलिए ज़रूरी है, क्योंकि हो सकता है कि आपका ऐप्लिकेशन ऐसे कॉन्फ़िगरेशन पर काम करे जिसके बारे में आपने सोचा न हो. इसके अलावा, Android के नए वर्शन में कभी-कभी ऐसे कॉन्फ़िगरेशन क्वालिफ़ायर जोड़े जाते हैं जो पुराने वर्शन पर काम नहीं करते. अगर आपने नए रिसॉर्स क्वालिफ़ायर का इस्तेमाल किया है, लेकिन Android के पुराने वर्शन के साथ कोड की कंपैटिबिलिटी बनाए रखी है, तो Android के पुराने वर्शन पर आपका ऐप्लिकेशन चलने पर क्रैश हो जाएगा. ऐसा तब होगा, जब आपने डिफ़ॉल्ट रिसॉर्स उपलब्ध नहीं कराए होंगे. इसकी वजह यह है कि Android का पुराना वर्शन, नए क्वालिफ़ायर के नाम वाले रिसॉर्स का इस्तेमाल नहीं कर सकता.
उदाहरण के लिए, अगर आपका minSdkVersion 4 पर सेट है और आपने नाइट मोड (night या notnight, जिन्हें एपीआई लेवल 8 में जोड़ा गया था) का इस्तेमाल करके अपने सभी ड्रॉएबल संसाधनों को क्वालिफ़ाई किया है, तो एपीआई लेवल 4 वाला डिवाइस आपके ड्रॉएबल संसाधनों को ऐक्सेस नहीं कर पाएगा और क्रैश हो जाएगा. इस मामले में, आपको शायद notnight को अपने डिफ़ॉल्ट संसाधन के तौर पर इस्तेमाल करना हो. इसलिए, उस क्वालिफ़ायर को हटाएं और अपने ड्रॉएबल संसाधनों को drawable/ या drawable-night/ में से किसी एक में रखें.
संक्षेप में, डिवाइस के साथ बेहतर तरीके से काम करने के लिए, हमेशा उन संसाधनों के लिए डिफ़ॉल्ट संसाधन उपलब्ध कराएं जिनकी ज़रूरत आपके ऐप्लिकेशन को सही तरीके से काम करने के लिए होती है. इसके बाद, कॉन्फ़िगरेशन क्वालिफ़ायर का इस्तेमाल करके, डिवाइस के खास कॉन्फ़िगरेशन के लिए वैकल्पिक संसाधन बनाएं.
इस नियम का एक अपवाद है: अगर आपके ऐप्लिकेशन का minSdkVersion 4 या इससे ज़्यादा है, तो स्क्रीन डेंसिटी क्वालिफ़ायर के साथ वैकल्पिक ड्रॉएबल संसाधन उपलब्ध कराते समय, आपको डिफ़ॉल्ट ड्रॉएबल संसाधनों की ज़रूरत नहीं होती. डिफ़ॉल्ट ड्रॉएबल रिसॉर्स के बिना भी, Android स्क्रीन डेंसिटी के विकल्पों में से सबसे सही विकल्प चुन सकता है. साथ ही, ज़रूरत के मुताबिक बिटमैप को स्केल कर सकता है. हालांकि, सभी तरह के डिवाइसों पर बेहतर अनुभव पाने के लिए, तीनों तरह की डेंसिटी के लिए वैकल्पिक ड्रॉएबल उपलब्ध कराएं.
Android, सबसे मिलते-जुलते संसाधन को कैसे ढूंढता है
जब किसी ऐसे संसाधन का अनुरोध किया जाता है जिसके लिए आपने विकल्प दिए हैं, तो Android यह चुनता है कि रनटाइम के दौरान कौनसा वैकल्पिक संसाधन इस्तेमाल करना है. यह मौजूदा डिवाइस कॉन्फ़िगरेशन पर निर्भर करता है. Android, किसी अन्य संसाधन को कैसे चुनता है, यह दिखाने के लिए मान लें कि यहां दी गई हर ड्रॉएबल डायरेक्ट्री में, एक ही इमेज के अलग-अलग वर्शन मौजूद हैं:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/
मान लें कि डिवाइस का कॉन्फ़िगरेशन यह है:
Locale = en-GB
नाइट मोड = night
स्क्रीन पिक्सल डेंसिटी = hdpi
टचस्क्रीन टाइप = notouch
टेक्स्ट डालने का मुख्य तरीका = 12key
डिवाइस कॉन्फ़िगरेशन की तुलना, उपलब्ध वैकल्पिक संसाधनों से करके Android, drawable-en-night से ड्रॉएबल चुनता है.
सिस्टम, यह तय करने के लिए कि किन संसाधनों का इस्तेमाल करना है, इस लॉजिक का इस्तेमाल करता है:
दूसरी इमेज. Android, सबसे मिलते-जुलते संसाधन को कैसे ढूंढता है, इसका फ़्लोचार्ट.
- ऐसी संसाधन फ़ाइलों को हटाना जो डिवाइस के कॉन्फ़िगरेशन के मुताबिक नहीं हैं.
drawable-fr-rCA/डायरेक्ट्री को हटा दिया गया है, क्योंकि यहen-GBके स्थानीय भाषा के हिसाब से सही नहीं है.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/अपवाद: स्क्रीन पिक्सल डेंसिटी एक ऐसा क्वालिफ़ायर है जिसे विरोधाभास की वजह से नहीं हटाया जाता. डिवाइस की स्क्रीन डेंसिटी hdpi होने के बावजूद,
drawable-night-ldpi/को नहीं हटाया गया है. ऐसा इसलिए, क्योंकि इस समय हर स्क्रीन डेंसिटी को मैच माना जाता है. जानकारी के लिए, स्क्रीन कंपैटबिलिटी के बारे में खास जानकारी लेख पढ़ें. - सूची में, सबसे ज़्यादा प्राथमिकता वाले क्वालिफ़ायर के बाद दूसरे नंबर पर आने वाला क्वालिफ़ायर ढूंढें (टेबल 2). (एमसीसी से शुरू करें.)
- क्या किसी भी संसाधन डायरेक्ट्री में यह क्वालिफ़ायर शामिल है?
- अगर ऐसा नहीं है, तो दूसरे चरण पर वापस जाएं और अगले क्वालिफ़ायर को देखें. इस उदाहरण में, भाषा के क्वालिफ़ायर तक जवाब "नहीं" है.
- अगर हां, तो चौथे चरण पर जाएं.
- उन संसाधन डायरेक्ट्री को हटाएं जिनमें यह क्वालिफ़ायर शामिल नहीं है. इस उदाहरण में, सिस्टम उन सभी डायरेक्ट्री को हटा देता है जिनमें भाषा क्वालिफ़ायर शामिल नहीं है:
drawable/drawable-en/ drawable-en-night/ drawable-en-notouch-12key/drawable-night-ldpi/drawable-night-notouch-12key/अपवाद: अगर सवाल में पूछा गया क्वालिफ़ायर, स्क्रीन की पिक्सल डेंसिटी है, तो Android उस विकल्प को चुनता है जो डिवाइस की स्क्रीन डेंसिटी से सबसे ज़्यादा मेल खाता है. आम तौर पर, Android छोटी ओरिजनल इमेज को बड़ा करने के बजाय, बड़ी ओरिजनल इमेज को छोटा करने को प्राथमिकता देता है. ज़्यादा जानकारी के लिए, स्क्रीन के साथ काम करने की सुविधा के बारे में खास जानकारी लेख पढ़ें.
- जब तक सिर्फ़ एक डायरेक्ट्री न रह जाए, तब तक दूसरे, तीसरे, और चौथे चरण को दोहराएं. इस उदाहरण में, नाइट मोड अगला क्वालिफ़ायर है, जिसके लिए कोई मैच मौजूद है.
इसलिए, जिन संसाधनों में नाइट मोड के बारे में जानकारी नहीं दी गई है उन्हें हटा दिया जाता है:
drawable-en/drawable-en-night/drawable-en-notouch-12key/बची हुई डायरेक्ट्री
drawable-en-nightहै.
हालांकि, यह प्रोसेस अनुरोध की गई हर संसाधन के लिए की जाती है, लेकिन सिस्टम इसके कुछ पहलुओं को ऑप्टिमाइज़ करता है. इस तरह के ऑप्टिमाइज़ेशन का एक उदाहरण यह है कि डिवाइस के कॉन्फ़िगरेशन के बारे में पता चलने के बाद, यह उन वैकल्पिक संसाधनों को हटा सकता है जो कभी मैच नहीं कर सकते. उदाहरण के लिए, अगर कॉन्फ़िगरेशन की भाषा अंग्रेज़ी है, तो भाषा क्वालिफ़ायर के तौर पर अंग्रेज़ी के अलावा कोई दूसरी भाषा सेट करने वाली कोई भी रिसॉर्स डायरेक्ट्री, कभी भी जांच किए गए रिसॉर्स के पूल में शामिल नहीं की जाती. हालांकि, भाषा क्वालिफ़ायर के बिना वाली रिसॉर्स डायरेक्ट्री अब भी शामिल की जाती है.
स्क्रीन के साइज़ के हिसाब से क्वालिफ़ायर के आधार पर संसाधन चुनते समय, सिस्टम ऐसे संसाधनों का इस्तेमाल करता है जिन्हें मौजूदा स्क्रीन से छोटी स्क्रीन के लिए डिज़ाइन किया गया है. ऐसा तब होता है, जब कोई ऐसा संसाधन उपलब्ध न हो जो स्क्रीन के साइज़ के हिसाब से बेहतर तरीके से मैच करता हो. उदाहरण के लिए, अगर ज़रूरी हो, तो बड़ी स्क्रीन पर सामान्य साइज़ की स्क्रीन के संसाधनों का इस्तेमाल किया जाता है.
हालांकि, अगर उपलब्ध संसाधन, मौजूदा स्क्रीन से बड़े हैं, तो सिस्टम उनका इस्तेमाल नहीं करता है. साथ ही, अगर कोई अन्य संसाधन, डिवाइस के कॉन्फ़िगरेशन से मेल नहीं खाता है, तो आपका ऐप्लिकेशन क्रैश हो जाता है. उदाहरण के लिए, ऐसा तब होता है, जब सभी लेआउट रिसॉर्स को xlarge क्वालिफ़ायर के साथ टैग किया गया हो, लेकिन डिवाइस की स्क्रीन सामान्य साइज़ की हो.
ध्यान दें: टेबल 2 में दिए गए क्वालिफ़ायर की प्राथमिकता, डिवाइस से पूरी तरह मेल खाने वाले क्वालिफ़ायर की संख्या से ज़्यादा अहम होती है. ऊपर दिए गए उदाहरण में, चौथे चरण में सूची में मौजूद आखिरी विकल्प में तीन क्वालिफ़ायर शामिल हैं. ये डिवाइस से पूरी तरह मेल खाते हैं (नाइट मोड, टचस्क्रीन टाइप, और इनपुट का तरीका). वहीं, drawable-en में सिर्फ़ एक ऐसा पैरामीटर है जो मेल खाता है (भाषा). हालांकि, भाषा को इन अन्य क्वालिफ़ायर से ज़्यादा प्राथमिकता दी जाती है. इसलिए, drawable-night-notouch-12key को हटा दिया जाता है.
अन्य संसाधन
ऐप्लिकेशन के संसाधनों के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें: