संसाधन, अतिरिक्त फ़ाइलें और स्टैटिक कॉन्टेंट होते हैं. इनका इस्तेमाल आपका कोड करता है. जैसे, बिटमैप, लेआउट की परिभाषाएं, उपयोगकर्ता इंटरफ़ेस स्ट्रिंग, ऐनिमेशन के निर्देश वगैरह.
ऐप्लिकेशन के संसाधनों, जैसे कि इमेज और स्ट्रिंग को हमेशा अपने कोड से अलग रखें, ताकि उन्हें अलग से मैनेज किया जा सके. साथ ही, खास डिवाइस कॉन्फ़िगरेशन के लिए वैकल्पिक संसाधन उपलब्ध कराएं. इसके लिए, उन्हें खास नाम वाली संसाधन डायरेक्ट्री में ग्रुप करें. रनटाइम के दौरान, Android मौजूदा कॉन्फ़िगरेशन के आधार पर सही संसाधन का इस्तेमाल करता है. उदाहरण के लिए, आपको स्क्रीन के साइज़ के हिसाब से अलग-अलग यूज़र इंटरफ़ेस (यूआई) लेआउट या भाषा की सेटिंग के हिसाब से अलग-अलग स्ट्रिंग देनी पड़ सकती हैं.
अपने ऐप्लिकेशन के संसाधनों को बाहरी बनाने के बाद, उन्हें ऐक्सेस किया जा सकता है. इसके लिए, आपको उन संसाधन आईडी का इस्तेमाल करना होगा जो आपके प्रोजेक्ट की R क्लास में जनरेट होते हैं.
इस दस्तावेज़ में, Android प्रोजेक्ट में संसाधनों को ग्रुप करने का तरीका बताया गया है. इसमें यह भी बताया गया है कि डिवाइस के खास कॉन्फ़िगरेशन के लिए, वैकल्पिक संसाधन कैसे उपलब्ध कराए जाएं. साथ ही, उन्हें अपने ऐप्लिकेशन कोड या अन्य एक्सएमएल फ़ाइलों से कैसे ऐक्सेस किया जाए.
ग्रुप किए गए संसाधन टाइप
हर तरह के संसाधन को अपने प्रोजेक्ट की res/ डायरेक्ट्री की किसी खास सबडायरेक्ट्री में रखें. उदाहरण के लिए, यहां एक सामान्य प्रोजेक्ट के लिए फ़ाइल का क्रम दिया गया है:
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
res/ डायरेक्ट्री में, इसकी सबडायरेक्ट्री में मौजूद सभी संसाधन शामिल होते हैं: एक इमेज रिसॉर्स, दो लेआउट रिसॉर्स, लॉन्चर आइकॉन के लिए mipmap/ डायरेक्ट्री, और एक स्ट्रिंग रिसॉर्स फ़ाइल. संसाधन डायरेक्ट्री के नाम ज़रूरी हैं. इनके बारे में टेबल 1 में बताया गया है.
ध्यान दें: मिपमैप फ़ोल्डर इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन के आइकॉन को मिपमैप डायरेक्ट्री में रखें लेख पढ़ें.
पहली टेबल. प्रोजेक्ट res/ डायरेक्ट्री में काम करने वाली रिसॉर्स डायरेक्ट्री.
| डायरेक्ट्री | संसाधन का टाइप |
|---|---|
animator/ |
प्रॉपर्टी ऐनिमेशन तय करने वाली एक्सएमएल फ़ाइलें. |
anim/ |
ट्वीन ऐनिमेशन तय करने वाली एक्सएमएल फ़ाइलें. प्रॉपर्टी के ऐनिमेशन भी इस डायरेक्ट्री में सेव किए जा सकते हैं. हालांकि, प्रॉपर्टी के ऐनिमेशन के लिए animator/ डायरेक्ट्री का इस्तेमाल करना बेहतर होता है, ताकि दोनों तरह के ऐनिमेशन के बीच अंतर किया जा सके. |
color/ |
ऐसी एक्सएमएल फ़ाइलें जो रंगों की स्थिति के हिसाब से सूची तय करती हैं. ज़्यादा जानकारी के लिए, कलर स्टेट लिस्ट रिसॉर्स देखें. |
drawable/ |
बिटमैप फ़ाइलें (PNG,
ज़्यादा जानकारी के लिए, ड्रॉएबल रिसॉर्स देखें. |
mipmap/ |
अलग-अलग लॉन्चर आइकॉन डेंसिटी के लिए ड्रॉएबल फ़ाइलें. mipmap/ फ़ोल्डर की मदद से लॉन्चर आइकॉन मैनेज करने के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन आइकॉन को मिपमैप डायरेक्ट्री में रखना लेख पढ़ें. |
layout/ |
एक्सएमएल फ़ाइलें, जो यूज़र इंटरफ़ेस लेआउट तय करती हैं. ज़्यादा जानकारी के लिए, लेआउट संसाधन देखें. |
menu/ |
ऐप्लिकेशन के मेन्यू तय करने वाली एक्सएमएल फ़ाइलें. जैसे, विकल्प मेन्यू, कॉन्टेक्स्ट मेन्यू या सबमेन्यू. ज़्यादा जानकारी के लिए, मेन्यू रिसॉर्स देखें. |
raw/ |
फ़ाइलों को उनके रॉ फ़ॉर्म में सेव करने के लिए. इन संसाधनों को रॉ हालांकि, अगर आपको ओरिजनल फ़ाइल के नामों और फ़ाइल हैरारकी का ऐक्सेस चाहिए, तो |
values/ |
ऐसी एक्सएमएल फ़ाइलें जिनमें स्ट्रिंग, पूर्णांक, और रंग जैसी सामान्य वैल्यू शामिल होती हैं. वहीं, अन्य हर संसाधन को उसके अपने एक्सएमएल एलिमेंट के साथ तय किया जाता है. इसलिए, फ़ाइल का नाम अपनी पसंद के हिसाब से रखा जा सकता है. साथ ही, एक ही फ़ाइल में अलग-अलग तरह के संसाधन रखे जा सकते हैं. हालांकि, बेहतर तरीके से समझने के लिए, अलग-अलग फ़ाइलों में यूनीक रिसॉर्स टाइप रखे जा सकते हैं. उदाहरण के लिए, इस डायरेक्ट्री में बनाई जा सकने वाली फ़ाइलों के नाम रखने के कुछ नियम यहां दिए गए हैं:
ज़्यादा जानकारी के लिए, स्ट्रिंग रिसॉर्स, स्टाइल रिसॉर्स, और अन्य रिसॉर्स टाइप देखें. |
xml/ |
ऐसी एक्सएमएल फ़ाइलें जिन्हें रनटाइम के दौरान Resources.getXML() को कॉल करके पढ़ा जा सकता है. यहां अलग-अलग तरह की XML कॉन्फ़िगरेशन फ़ाइलें सेव की जानी चाहिए. जैसे, खोज का कॉन्फ़िगरेशन.
|
font/ |
TTF, OTF या TTC जैसे एक्सटेंशन वाली फ़ॉन्ट फ़ाइलें या ऐसी एक्सएमएल फ़ाइलें जिनमें <font-family> एलिमेंट शामिल हो. संसाधन के तौर पर फ़ॉन्ट के बारे में ज़्यादा जानने के लिए, एक्सएमएल संसाधन के तौर पर फ़ॉन्ट जोड़ना लेख पढ़ें.
|
चेतावनी: संसाधन फ़ाइलों को सीधे तौर पर कभी भी res/ डायरेक्ट्री में सेव न करें. इससे कंपाइलर से जुड़ी गड़बड़ी होती है.
अलग-अलग तरह के संसाधनों के बारे में ज़्यादा जानने के लिए, संसाधन के टाइप की खास जानकारी देखें.
टेबल 1 में बताई गई सबडायरेक्ट्री में सेव किए गए रिसॉर्स, आपके डिफ़ॉल्ट रिसॉर्स होते हैं. इसका मतलब है कि ये संसाधन, आपके ऐप्लिकेशन के लिए डिफ़ॉल्ट डिज़ाइन और कॉन्टेंट तय करते हैं. हालांकि, Android पर काम करने वाले अलग-अलग तरह के डिवाइसों के लिए, अलग-अलग तरह के संसाधनों की ज़रूरत पड़ सकती है.
उदाहरण के लिए, बड़ी स्क्रीन वाले डिवाइसों के लिए अलग-अलग लेआउट संसाधन उपलब्ध कराए जा सकते हैं. इससे स्क्रीन पर मौजूद अतिरिक्त जगह का फ़ायदा उठाया जा सकता है. डिवाइस की भाषा की सेटिंग के आधार पर, यूज़र इंटरफ़ेस में मौजूद टेक्स्ट का अनुवाद करने के लिए, अलग-अलग स्ट्रिंग संसाधन भी उपलब्ध कराए जा सकते हैं. अलग-अलग डिवाइस कॉन्फ़िगरेशन के लिए, ये अलग-अलग संसाधन उपलब्ध कराने के लिए, आपको डिफ़ॉल्ट संसाधनों के अलावा, वैकल्पिक संसाधन भी उपलब्ध कराने होंगे.
वैकल्पिक रिसॉर्स उपलब्ध कराना
ज़्यादातर ऐप्लिकेशन, डिवाइस के खास कॉन्फ़िगरेशन के साथ काम करने के लिए, वैकल्पिक संसाधन उपलब्ध कराते हैं. उदाहरण के लिए, अलग-अलग स्क्रीन डेंसिटी के लिए वैकल्पिक ड्रॉएबल संसाधन और अलग-अलग भाषाओं के लिए वैकल्पिक स्ट्रिंग संसाधन शामिल करें. रनटाइम के दौरान, 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 |
उपयोगकर्ता का व्याकरण के हिसाब से लिंग. इसका इस्तेमाल उन भाषाओं के लिए किया जाता है जिनमें व्याकरण के हिसाब से लिंग होता है. उदाहरण के लिए, अगर आपको फ़्रेंच बोलने वाले लोगों के लिए अलग-अलग संसाधन उपलब्ध कराने हैं, तो यहां दी गई डायरेक्ट्री का इस्तेमाल किया जा सकता है:
Android में अपने हिसाब से जेंडर चुनना देखें.
इसे एपीआई लेवल 34 में जोड़ा गया है. |
| लेआउट की दिशा | ldrtlldltr |
आपके ऐप्लिकेशन का लेआउट. यह किसी भी संसाधन पर लागू हो सकता है. जैसे, लेआउट, ड्रॉएबल या वैल्यू. उदाहरण के लिए, अगर आपको अरबी भाषा के लिए कोई खास लेआउट और फ़ारसी या हिब्रू जैसी किसी अन्य "दाईं से बाईं ओर" लिखी जाने वाली भाषा के लिए कोई सामान्य लेआउट देना है, तो इस तरह की डायरेक्ट्री का इस्तेमाल करें:
ध्यान दें: अपने ऐप्लिकेशन के लिए, दाएं से बाएं ओर लिखे जाने वाले लेआउट की सुविधाएं चालू करने के लिए, आपको इसे एपीआई लेवल 17 में जोड़ा गया है. |
| सबसे कम चौड़ाई की स्क्रीन सेट करें | sw<N>dpउदाहरण: sw320dpsw600dpsw720dpवगैरह. |
ऐप्लिकेशन के लिए उपलब्ध स्क्रीन एरिया का सबसे छोटा डाइमेंशन.
खास तौर पर, ऐप्लिकेशन विंडो का
उदाहरण के लिए, अगर आपके लेआउट के लिए यह ज़रूरी है कि स्क्रीन एरिया का सबसे छोटा डाइमेंशन हमेशा कम से कम 600 डीपी हो, तो इस क्वालिफ़ायर का इस्तेमाल करके, स्क्रीन के सामान्य साइज़ का पता लगाने के लिए, सबसे कम चौड़ाई का इस्तेमाल करना फ़ायदेमंद होता है. ऐसा इसलिए, क्योंकि लेआउट डिज़ाइन करते समय चौड़ाई अक्सर अहम भूमिका निभाती है. यूज़र इंटरफ़ेस (यूआई) को अक्सर वर्टिकल तौर पर स्क्रोल किया जाता है. हालांकि, इसे हॉरिज़ॉन्टल तौर पर कम से कम जगह की ज़रूरत होती है. स्क्रीन की चौड़ाई भी यह तय करने में अहम भूमिका निभाती है कि हैंडसेट के लिए एक पैन वाला लेआउट इस्तेमाल करना है या टैबलेट के लिए मल्टीपैन वाला लेआउट. इसलिए, आपको इस बात से ज़्यादा फ़र्क़ पड़ता है कि हर डिवाइस पर सबसे कम चौड़ाई कितनी है. डिवाइस की सबसे कम चौड़ाई में, स्क्रीन डेकोरेशन और सिस्टम यूज़र इंटरफ़ेस (यूआई) को ध्यान में रखा जाता है. उदाहरण के लिए, अगर डिवाइस की स्क्रीन पर ऐसे यूज़र इंटरफ़ेस (यूआई) एलिमेंट मौजूद हैं जो सबसे कम चौड़ाई वाले ऐक्सिस के साथ जगह घेरते हैं, तो सिस्टम सबसे कम चौड़ाई को स्क्रीन के असल साइज़ से कम मानता है. ऐसा इसलिए, क्योंकि वे स्क्रीन पिक्सल आपके यूज़र इंटरफ़ेस (यूआई) के लिए उपलब्ध नहीं हैं. यहां स्क्रीन के सामान्य साइज़ के लिए इस्तेमाल की जा सकने वाली कुछ वैल्यू दी गई हैं:
जब आपका ऐप्लिकेशन, इसे एपीआई लेवल 13 में जोड़ा गया है.
इस क्वालिफ़ायर का इस्तेमाल करके, अलग-अलग स्क्रीन के लिए डिज़ाइन करने के बारे में ज़्यादा जानने के लिए, व्यू के साथ रिस्पॉन्सिव/अडैप्टिव डिज़ाइन देखें. |
| उपलब्ध चौड़ाई और ऊंचाई | w<N>dph<N>dpउदाहरण: w720dpw1024dph720dph1024dpवगैरह. |
यह विकल्प, स्क्रीन की कम से कम उपलब्ध चौड़ाई या ऊंचाई ( उपलब्ध चौड़ाई और ऊंचाई से यह तय करने में मदद मिलती है कि मल्टीपैन लेआउट का इस्तेमाल करना है या नहीं. ऐसा इसलिए, क्योंकि टैबलेट डिवाइस पर भी पोर्ट्रेट ओरिएंटेशन के लिए, लैंडस्केप ओरिएंटेशन के जैसा मल्टीपैन लेआउट इस्तेमाल नहीं करना होता. इसलिए, लेआउट के लिए ज़रूरी कम से कम चौड़ाई और/या ऊंचाई के बारे में बताने के लिए, इनका इस्तेमाल किया जा सकता है. इसके लिए, स्क्रीन साइज़ और ओरिएंटेशन क्वालिफ़ायर, दोनों का एक साथ इस्तेमाल करने की ज़रूरत नहीं है. जब आपका ऐप्लिकेशन, इन कॉन्फ़िगरेशन के लिए अलग-अलग वैल्यू वाली कई संसाधन डायरेक्ट्री उपलब्ध कराता है, तो सिस्टम उस डायरेक्ट्री का इस्तेमाल करता है जिसकी वैल्यू, डिवाइस की मौजूदा स्क्रीन की चौड़ाई के सबसे करीब होती है. हालांकि, यह वैल्यू स्क्रीन की चौड़ाई से ज़्यादा नहीं होनी चाहिए. सबसे मिलता-जुलता विकल्प का पता लगाने के लिए, स्क्रीन की असल चौड़ाई और तय की गई चौड़ाई के बीच के अंतर को स्क्रीन की असल लंबाई और तय की गई लंबाई के बीच के अंतर में जोड़ा जाता है. लंबाई और चौड़ाई की तय न की गई वैल्यू 0 होती है. इन वैल्यू में, विंडो इंसर्ट के लिए रिज़र्व की गई जगह शामिल नहीं होती. इसलिए, अगर डिवाइस के डिसप्ले के किनारों पर यूज़र इंटरफ़ेस (यूआई) के एलिमेंट मौजूद हैं, तो चौड़ाई और ऊंचाई की वैल्यू, स्क्रीन के असल डाइमेंशन से कम होती हैं. भले ही, ऐप्लिकेशन को किनारे से किनारे तक
कुछ वर्टिकल स्क्रीन डेकोरेशन ऐसे होते हैं जो तय नहीं होते. जैसे, फ़ोन का स्टेटस बार, जिसे फ़ुल स्क्रीन मोड में छिपाया जा सकता है. इन्हें यहां शामिल नहीं किया गया है. साथ ही, टाइटल बार या ऐक्शन बार जैसे विंडो डेकोरेशन भी शामिल नहीं किए गए हैं. इसलिए, ऐप्लिकेशन को उस जगह के लिए तैयार रहना चाहिए जो उन्होंने तय की है. ध्यान दें: सिस्टम, चौड़ाई और ऊंचाई, दोनों के हिसाब से मैच करने वाले संसाधन को चुनता है. इसलिए, ऐसे संसाधन को प्राथमिकता दी जाती है जिसमें दोनों के बारे में बताया गया हो. इसके मुकाबले, ऐसे संसाधन को प्राथमिकता नहीं दी जाती जिसमें सिर्फ़ एक के बारे में बताया गया हो. उदाहरण के लिए, अगर स्क्रीन की चौड़ाई 720 डीपी और ऊंचाई 1280 डीपी है, तो w720dp के तौर पर क्वालिफ़ाई किए गए रिसॉर्स के बजाय w700dp-h1200dp के तौर पर क्वालिफ़ाई किए गए रिसॉर्स को चुना जाएगा. भले ही, w720dp स्क्रीन की चौड़ाई के हिसाब से पूरी तरह से मेल खाता हो. इसे एपीआई लेवल 13 में जोड़ा गया है.
इस क्वालिफ़ायर का इस्तेमाल करके, अलग-अलग स्क्रीन के लिए डिज़ाइन करने के बारे में ज़्यादा जानने के लिए, व्यू के साथ रिस्पॉन्सिव/अडैप्टिव डिज़ाइन देखें. |
| स्क्रीन का साइज़ |
smallnormallargexlarge
|
ध्यान दें: साइज़ क्वालिफ़ायर का इस्तेमाल करने का मतलब यह नहीं है कि रिसॉर्स, सिर्फ़ उस साइज़ की स्क्रीन के लिए हैं. अगर आपने क्वालिफ़ायर के साथ ऐसे संसाधन नहीं दिए हैं जो मौजूदा डिवाइस के कॉन्फ़िगरेशन से बेहतर तरीके से मेल खाते हैं, तो सिस्टम उन संसाधनों का इस्तेमाल कर सकता है जो सबसे सही मेल खाते हैं. चेतावनी: अगर आपके सभी संसाधनों में, साइज़ क्वालिफ़ायर का इस्तेमाल किया गया है और वह मौजूदा स्क्रीन के साइज़ से बड़ा है, तो सिस्टम उनका इस्तेमाल नहीं करेगा. साथ ही, रनटाइम के दौरान आपका ऐप्लिकेशन क्रैश हो जाएगा. उदाहरण के लिए, ऐसा तब होता है, जब सभी लेआउट रिसॉर्स को इसे एपीआई लेवल 4 में जोड़ा गया है.
ज़्यादा जानकारी के लिए, स्क्रीन के साथ काम करने की सुविधा के बारे में खास जानकारी लेख पढ़ें. |
| स्क्रीन का आसपेक्ट रेशियो |
longnotlong
|
इसे एपीआई लेवल 4 में जोड़ा गया है. यह पूरी तरह से स्क्रीन के आसपेक्ट रेशियो पर आधारित होता है (
|
| गोल स्क्रीन |
roundnotround
|
इसे एपीआई लेवल 23 में जोड़ा गया था.
|
| वाइड कलर गैमट |
widecgnowidecg
|
इसे एपीआई लेवल 26 में जोड़ा गया है.
|
| हाई डाइनैमिक रेंज (एचडीआर) |
highdrlowdr
|
इसे एपीआई लेवल 26 में जोड़ा गया है.
|
| स्क्रीन की दिशा |
portland
|
अगर उपयोगकर्ता स्क्रीन को घुमाता है, तो ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. इसकी वजह से, रनटाइम के दौरान आपके ऐप्लिकेशन पर क्या असर पड़ता है, इस बारे में जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें.
|
| यूज़र इंटरफ़ेस (यूआई) मोड |
cardesktelevisionappliancewatchvrheadset
|
एपीआई लेवल 8 में जोड़ा गया; टीवी को एपीआई 13 में जोड़ा गया; वॉच को एपीआई 20 में जोड़ा गया. डिवाइस को डॉक में लगाने या निकालने पर, आपका ऐप्लिकेशन कैसे जवाब दे सकता है, इस बारे में जानकारी पाने के लिए, डॉक करने की स्थिति और टाइप का पता लगाना और उसे मॉनिटर करना लेख पढ़ें. अगर उपयोगकर्ता डिवाइस को डॉक में रखता है, तो आपके ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. |
| नाइट मोड |
nightnotnight
|
इसे एपीआई लेवल 8 में जोड़ा गया था. अगर नाइट मोड को ऑटो मोड (डिफ़ॉल्ट) पर सेट किया जाता है, तो ऐप्लिकेशन के इस्तेमाल के दौरान यह मोड बदल सकता है. ऐसा इसलिए होता है, क्योंकि दिन के समय के हिसाब से मोड बदलता है. |
| स्क्रीन पिक्सल डेंसिटी (डीपीआई) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
छह मुख्य डेंसिटी के बीच 3:4:6:8:12:16 का स्केलिंग अनुपात होता है. इसमें tvdpi डेंसिटी को शामिल नहीं किया जाता. इसलिए, ldpi में 9x9 बिटमैप, mdpi में 12x12, hdpi में 18x18, xhdpi में 24x24 वगैरह होता है. ध्यान दें: डेंसिटी क्वालिफ़ायर का इस्तेमाल करने का मतलब यह नहीं है कि संसाधन, उस डेंसिटी वाली स्क्रीन के लिए सिर्फ़ हैं. अगर आपने क्वालिफ़ायर के साथ ऐसे वैकल्पिक संसाधन उपलब्ध नहीं कराए हैं जो डिवाइस के मौजूदा कॉन्फ़िगरेशन से बेहतर तरीके से मेल खाते हैं, तो सिस्टम उन संसाधनों का इस्तेमाल करेगा जो सबसे ज़्यादा मेल खाते हैं. अलग-अलग स्क्रीन डेंसिटी को मैनेज करने और Android, मौजूदा डेंसिटी के हिसाब से आपके बिटमैप को कैसे स्केल कर सकता है, इस बारे में ज़्यादा जानने के लिए स्क्रीन कंपैटिबिलिटी की खास जानकारी देखें. |
| टचस्क्रीन का टाइप |
notouchfinger
|
|
| कीबोर्ड की उपलब्धता |
keysexposedkeyshiddenkeyssoft
|
अगर आपने अगर उपयोगकर्ता हार्डवेयर कीबोर्ड खोलता है, तो ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. इसकी वजह से, रनटाइम के दौरान आपके ऐप्लिकेशन पर क्या असर पड़ता है, इस बारे में जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें. कॉन्फ़िगरेशन फ़ील्ड |
| टेक्स्ट डालने का मुख्य तरीका |
nokeysqwerty12key
|
|
| नेविगेशन की उपलब्धता |
navexposednavhidden
|
अगर उपयोगकर्ता नेविगेशन कुंजियां दिखाता है, तो ऐप्लिकेशन के चालू रहने के दौरान यह बदल सकता है. इसकी वजह से, रनटाइम के दौरान आपके ऐप्लिकेशन पर क्या असर पड़ता है, इस बारे में जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें.
|
| बिना टच किए नेविगेट करने का मुख्य तरीका |
nonavdpadtrackballwheel
|
|
| प्लैटफ़ॉर्म वर्शन (एपीआई लेवल) | उदाहरण:v3v4v7वगैरह. |
डिवाइस पर काम करने वाला एपीआई लेवल. उदाहरण के लिए, एपीआई लेवल 1 (Android 1.0 या इसके बाद के वर्शन वाले डिवाइस) के लिए |
ध्यान दें: Android के सभी वर्शन में, सभी क्वालिफ़ायर काम नहीं करते. नए क्वालिफ़ायर का इस्तेमाल करने पर, प्लैटफ़ॉर्म वर्शन क्वालिफ़ायर अपने-आप जुड़ जाता है. इससे पुराने डिवाइस इसे अनदेखा कर सकते हैं. उदाहरण के लिए, w600dp क्वालिफ़ायर का इस्तेमाल करने पर, v13 क्वालिफ़ायर अपने-आप शामिल हो जाता है. ऐसा इसलिए होता है, क्योंकि उपलब्ध चौड़ाई वाला क्वालिफ़ायर, एपीआई लेवल 13 में नया था. किसी भी समस्या से बचने के लिए, हमेशा डिफ़ॉल्ट संसाधनों का एक सेट शामिल करें. यह बिना क्वालिफ़ायर वाले संसाधनों का एक सेट होता है. ज़्यादा जानकारी के लिए, संसाधनों के साथ डिवाइस के सबसे सही तरीके से काम करने के बारे में जानकारी सेक्शन देखें.
क्वालिफ़ायर के नाम से जुड़े नियम
कॉन्फ़िगरेशन क्वालिफ़ायर के नामों का इस्तेमाल करने के बारे में कुछ नियम यहां दिए गए हैं:
- संसाधनों के एक सेट के लिए, डैश से अलग किए गए कई क्वालिफ़ायर तय किए जा सकते हैं. उदाहरण के लिए,
drawable-en-rUS-landअमेरिका में अंग्रेज़ी भाषा के लिए उपलब्ध है. यह लैंडस्केप ओरिएंटेशन में काम करता है. - क्वालिफ़ायर, टेबल 2 में दिए गए क्रम में होने चाहिए.
- गलत:
drawable-hdpi-port/ - सही:
drawable-port-hdpi/
- गलत:
- वैकल्पिक संसाधन डायरेक्ट्री को नेस्ट नहीं किया जा सकता. उदाहरण के लिए,
res/drawable/drawable-en/का इस्तेमाल नहीं किया जा सकता. - वैल्यू, केस-इनसेंसिटिव होती हैं. संसाधन कंपाइलर, डायरेक्ट्री के नामों को प्रोसेस करने से पहले उन्हें छोटे अक्षरों में बदल देता है. इससे केस-इनसेंसिटिव फ़ाइल सिस्टम में समस्याएं नहीं आती हैं. नामों में कैपिटल लेटर का इस्तेमाल सिर्फ़ इसलिए किया गया है, ताकि उन्हें आसानी से पढ़ा जा सके.
- हर क्वालिफ़ायर टाइप के लिए, सिर्फ़ एक वैल्यू इस्तेमाल की जा सकती है. उदाहरण के लिए, अगर आपको स्पेन और फ़्रांस के लिए एक ही ड्रॉएबल फ़ाइलों का इस्तेमाल करना है, तो आपके पास
drawable-es-fr/नाम की डायरेक्ट्री नहीं हो सकती. इसके बजाय, आपको दो रिसॉर्स डायरेक्ट्री की ज़रूरत होती है. जैसे,drawable-es/औरdrawable-fr/. इनमें सही फ़ाइलें होती हैं. हालांकि, आपको दोनों जगहों पर फ़ाइलों को डुप्लीकेट करने की ज़रूरत नहीं है. इसके बजाय, एलियास संसाधन बनाएं सेक्शन में बताए गए तरीके से, किसी संसाधन के लिए एलियास बनाया जा सकता है.
इन क्वालिफ़ायर के नाम वाली डायरेक्ट्री में वैकल्पिक संसाधन सेव करने के बाद, Android आपके ऐप्लिकेशन में मौजूद संसाधनों को डिवाइस के मौजूदा कॉन्फ़िगरेशन के आधार पर अपने-आप लागू कर देता है. जब भी किसी संसाधन का अनुरोध किया जाता है, तब Android, संसाधन फ़ाइल वाली अन्य डायरेक्ट्री की जांच करता है. इसके बाद, सबसे मिलती-जुलती संसाधन फ़ाइल ढूंढता है.
अगर किसी डिवाइस कॉन्फ़िगरेशन से मेल खाने वाले कोई अन्य संसाधन नहीं हैं, तो Android उससे जुड़े डिफ़ॉल्ट संसाधनों का इस्तेमाल करता है. ये किसी संसाधन टाइप के लिए संसाधनों का ऐसा सेट होता है जिसमें कॉन्फ़िगरेशन क्वालिफ़ायर शामिल नहीं होता.
उपनाम वाले संसाधन बनाना
अगर आपको किसी संसाधन का इस्तेमाल एक से ज़्यादा डिवाइस कॉन्फ़िगरेशन के लिए करना है, लेकिन उसे डिफ़ॉल्ट संसाधन के तौर पर उपलब्ध नहीं कराना है, तो आपको एक ही संसाधन को एक से ज़्यादा वैकल्पिक संसाधन डायरेक्ट्री में रखने की ज़रूरत नहीं है. इसके बजाय, कोई वैकल्पिक संसाधन बनाया जा सकता है. यह संसाधन, आपकी डिफ़ॉल्ट संसाधन डायरेक्ट्री में सेव किए गए संसाधन के लिए एलियास के तौर पर काम करता है.
ध्यान दें: सभी संसाधनों में, किसी दूसरे संसाधन का उपनाम बनाने की सुविधा उपलब्ध नहीं होती. खास तौर पर, xml/ डायरेक्ट्री में मौजूद ऐनिमेशन, मेन्यू, रॉ, और अन्य ऐसे संसाधन जिनके बारे में नहीं बताया गया है उनमें यह सुविधा उपलब्ध नहीं है.
उदाहरण के लिए, मान लें कि आपके पास एक ऐप्लिकेशन आइकॉन, icon.png है और आपको अलग-अलग स्थान-भाषाओं के लिए इसका यूनीक वर्शन चाहिए. हालांकि, अंग्रेज़ी-कैनडियन और फ़्रेंच-कैनडियन, दोनों स्थान-भाषाओं के लिए एक ही वर्शन का इस्तेमाल करना ज़रूरी है. आपको अंग्रेज़ी-कनाडा और फ़्रेंच-कनाडा, दोनों के लिए संसाधन डायरेक्ट्री में एक ही इमेज को कॉपी करने की ज़रूरत नहीं है.
इसके बजाय, दोनों के लिए इस्तेमाल की गई इमेज को icon.png के अलावा किसी भी नाम से सेव किया जा सकता है. जैसे, icon_ca.png. इसके बाद, इसे डिफ़ॉल्ट res/drawable/ डायरेक्ट्री में रखा जा सकता है. इसके बाद, res/drawable-en-rCA/ और res/drawable-fr-rCA/ में icon.xml फ़ाइल बनाएं. यह फ़ाइल, <bitmap> एलिमेंट का इस्तेमाल करके icon_ca.png रिसोर्स को रेफ़र करती है. इससे, PNG फ़ाइल का सिर्फ़ एक वर्शन और दो छोटी एक्सएमएल फ़ाइलें सेव की जा सकती हैं. ये फ़ाइलें, PNG फ़ाइल की ओर ले जाती हैं. ज़्यादा जानकारी के लिए, यहां दिए गए उदाहरण देखें.
ड्रॉएबल
किसी मौजूदा ड्रॉएबल का एलियास बनाने के लिए, <drawable> एलिमेंट का इस्तेमाल करें:
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
अगर इस फ़ाइल को किसी अन्य रिसॉर्स डायरेक्ट्री, जैसे कि res/values-en-rCA/ में icon.xml के तौर पर सेव किया जाता है, तो इसे ऐसे रिसॉर्स में कंपाइल किया जाता है जिसे R.drawable.icon के तौर पर रेफ़रंस किया जा सकता है. हालांकि, यह असल में R.drawable.icon_ca रिसॉर्स का एलियास होता है, जिसे res/drawable/ में सेव किया जाता है.
लेआउट
किसी मौजूदा लेआउट का अन्य नाम बनाने के लिए, <include> एलिमेंट का इस्तेमाल करें. इसे <merge> में रैप किया जाता है:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
अगर इस फ़ाइल को main.xml के तौर पर सेव किया जाता है, तो इसे ऐसे रिसॉर्स में कंपाइल किया जाता है जिसे R.layout.main के तौर पर रेफ़रंस किया जा सकता है. हालांकि, यह असल में R.layout.main_ltr रिसॉर्स का एलियास होता है.
स्ट्रिंग और अन्य सामान्य वैल्यू
किसी मौजूदा स्ट्रिंग का एलियास बनाने के लिए, नई स्ट्रिंग की वैल्यू के तौर पर, अपनी पसंद की स्ट्रिंग का संसाधन आईडी इस्तेमाल करें:
<?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, औरlayout. अलग-अलग टाइप के बारे में ज़्यादा जानने के लिए, संसाधन टाइप की खास जानकारी देखें. - संसाधन का नाम. यह एक्सटेंशन के बिना फ़ाइल का नाम होता है. अगर संसाधन कोई सामान्य वैल्यू है, जैसे कि स्ट्रिंग, तो यह XML
android:nameएट्रिब्यूट की वैल्यू होती है.
किसी संसाधन को ऐक्सेस करने के दो तरीके हैं:
- कोड में: अपनी
Rक्लास की सबक्लास से स्टैटिक पूर्णांक का इस्तेमाल करें. जैसे:R.string.hello
stringरिसॉर्स टाइप है औरhelloरिसॉर्स का नाम है. ऐसे कई Android API हैं जो इस फ़ॉर्मैट में रिसॉर्स आईडी देने पर, आपके रिसॉर्स को ऐक्सेस कर सकते हैं. ज़्यादा जानकारी के लिए, कोड में संसाधनों को ऐक्सेस करना सेक्शन देखें. - एक्सएमएल में: एक खास एक्सएमएल सिंटैक्स का इस्तेमाल करके, जो आपकी
Rक्लास में तय किए गए संसाधन आईडी से मेल खाता है. जैसे:@string/hello
stringरिसॉर्स टाइप है औरhelloरिसॉर्स का नाम है. इस सिंटैक्स का इस्तेमाल, एक्सएमएल रिसॉर्स में किसी भी ऐसी जगह पर किया जा सकता है जहां आपको रिसॉर्स में कोई वैल्यू देनी हो. ज़्यादा जानकारी के लिए, एक्सएमएल से संसाधनों को ऐक्सेस करना सेक्शन देखें.
कोड में मौजूद संसाधनों को ऐक्सेस करना
किसी संसाधन का इस्तेमाल कोड में किया जा सकता है. इसके लिए, संसाधन आईडी को तरीके के पैरामीटर के तौर पर पास करें. उदाहरण के लिए, setImageResource() का इस्तेमाल करके res/drawable/myimage.png रिसोर्स का इस्तेमाल करने के लिए, ImageView सेट किया जा सकता है:
Kotlin
val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)
Java
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
Resources में मौजूद तरीकों का इस्तेमाल करके, अलग-अलग संसाधनों को भी वापस पाया जा सकता है. getResources() की मदद से, आपको इसका इंस्टेंस मिल सकता है.
वाक्य-विन्यास
कोड में किसी संसाधन का रेफ़रंस देने का सिंटैक्स यहां दिया गया है:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>उस पैकेज का नाम है जिसमें संसाधन मौजूद है. हालांकि, अपने पैकेज के संसाधनों को रेफ़रंस करते समय इसकी ज़रूरत नहीं होती.<resource_type>, रिसॉर्स टाइप के लिएRसबक्लास है.<resource_name>, एक्सटेंशन के बिना संसाधन का फ़ाइल नाम होता है. इसके अलावा, यह एक्सएमएल एलिमेंट मेंandroid:nameएट्रिब्यूट की वैल्यू भी हो सकता है.
हर रिसॉर्स टाइप और उन्हें रेफ़रंस करने के तरीके के बारे में ज़्यादा जानने के लिए, रिसॉर्स टाइप की खास जानकारी देखें.
इस्तेमाल के उदाहरण
ऐसे कई तरीके हैं जो संसाधन आईडी पैरामीटर स्वीकार करते हैं. साथ ही, Resources में मौजूद तरीकों का इस्तेमाल करके संसाधनों को वापस पाया जा सकता है. Context.getResources() का इस्तेमाल करके, Resources का इंस्टेंस पाया जा सकता है.
कोड में संसाधनों को ऐक्सेस करने के कुछ उदाहरण यहां दिए गए हैं:
Kotlin
// Load a background for the current screen from a drawable resource. window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. window.setTitle(resources.getText(R.string.main_title)) // Load a custom layout for the current screen. setContentView(R.layout.main_screen) // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID. val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)
Java
// Load a background for the current screen from a drawable resource. getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ; // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. getWindow().setTitle(getResources().getText(R.string.main_title)); // Load a custom layout for the current screen. setContentView(R.layout.main_screen); // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)); // Set the text on a TextView object using a resource ID. TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello_message);
चेतावनी: R.java फ़ाइल में मैन्युअल तरीके से बदलाव न करें. जब आपका प्रोजेक्ट कंपाइल किया जाता है, तब यह aapt टूल से जनरेट होता है. अगली बार कंपाइल करने पर, सभी बदलावों को बदल दिया जाता है.
एक्सएमएल से संसाधनों को ऐक्सेस करना
किसी मौजूदा संसाधन का रेफ़रंस देकर, कुछ एक्सएमएल एट्रिब्यूट और एलिमेंट के लिए वैल्यू तय की जा सकती हैं. लेआउट फ़ाइलें बनाते समय, अक्सर ऐसा किया जाता है. इससे विजेट के लिए स्ट्रिंग और इमेज उपलब्ध कराई जा सकती हैं.
उदाहरण के लिए, अगर आपने अपने लेआउट में Button जोड़ा है, तो बटन के टेक्स्ट के लिए स्ट्रिंग रिसॉर्स का इस्तेमाल करें:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
वाक्य-विन्यास
एक्सएमएल रिसॉर्स में किसी रिसॉर्स को रेफ़रंस करने का सिंटैक्स यहां दिया गया है:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>उस पैकेज का नाम है जिसमें संसाधन मौजूद है. अगर एक ही पैकेज के संसाधनों को रेफ़रंस दिया जा रहा है, तो इसकी ज़रूरत नहीं है.<resource_type>, रिसॉर्स टाइप के लिएRसबक्लास है.<resource_name>, एक्सटेंशन के बिना संसाधन का फ़ाइल नाम या एक्सएमएल एलिमेंट मेंandroid:nameएट्रिब्यूट की वैल्यू होती है. यह वैल्यू, सामान्य वैल्यू के लिए होती है.
हर रिसॉर्स टाइप और उन्हें रेफ़रंस करने के तरीके के बारे में ज़्यादा जानने के लिए, रिसॉर्स टाइप की खास जानकारी देखें.
इस्तेमाल के उदाहरण
कुछ मामलों में, आपको एक्सएमएल में किसी वैल्यू के लिए रिसॉर्स का इस्तेमाल करना होगा. जैसे, किसी विजेट पर ड्रॉ किए जा सकने वाले इमेज को लागू करने के लिए. हालांकि, एक्सएमएल में किसी भी ऐसी जगह पर रिसॉर्स का इस्तेमाल किया जा सकता है जहां सामान्य वैल्यू स्वीकार की जाती है. उदाहरण के लिए, अगर आपके पास यह संसाधन फ़ाइल है, जिसमें कलर रिसॉर्स और स्ट्रिंग रिसॉर्स शामिल है:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
टेक्स्ट का रंग और टेक्स्ट स्ट्रिंग सेट करने के लिए, इन संसाधनों का इस्तेमाल इस लेआउट फ़ाइल में किया जा सकता है:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" />
इस मामले में, आपको संसाधन के रेफ़रंस में पैकेज का नाम बताने की ज़रूरत नहीं है, क्योंकि संसाधन आपके पैकेज से हैं. किसी सिस्टम रिसोर्स का रेफ़रंस देने के लिए, आपको पैकेज का नाम शामिल करना होगा. जैसा कि यहाँ दिए गए उदाहरण में दिखाया गया है:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@android:color/secondary_text_dark" android:text="@string/hello" />
ध्यान दें: हमेशा स्ट्रिंग रिसॉर्स का इस्तेमाल करें, ताकि आपके ऐप्लिकेशन को अन्य भाषाओं के लिए स्थानीय बनाया जा सके. वैकल्पिक संसाधन (जैसे कि स्थानीय भाषा में अनुवादित स्ट्रिंग) बनाने के बारे में जानकारी के लिए, वैकल्पिक संसाधन उपलब्ध कराना लेख पढ़ें. अपने ऐप्लिकेशन के कॉन्टेंट को दूसरी भाषाओं के हिसाब से बनाने के बारे में पूरी जानकारी पाने के लिए, अपने ऐप्लिकेशन के कॉन्टेंट को स्थानीय भाषा के हिसाब से बनाना लेख पढ़ें.
उपनाम बनाने के लिए, एक्सएमएल में मौजूद संसाधनों का भी इस्तेमाल किया जा सकता है. उदाहरण के लिए, एक ऐसा ड्रॉअबल संसाधन बनाया जा सकता है जो किसी दूसरे ड्रॉअबल संसाधन का एलियास हो:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
यह जानकारी दोहराई गई लगती है, लेकिन किसी दूसरे संसाधन का इस्तेमाल करते समय यह बहुत काम आ सकती है. ज़्यादा जानकारी के लिए, एलियास संसाधन बनाने के बारे में सेक्शन देखें.
रेफ़रंस स्टाइल एट्रिब्यूट
स्टाइल एट्रिब्यूट रिसॉर्स की मदद से, फ़िलहाल लागू की गई थीम में किसी एट्रिब्यूट की वैल्यू का रेफ़रंस दिया जा सकता है. स्टाइल एट्रिब्यूट को रेफ़रंस करने से, यूज़र इंटरफ़ेस (यूआई) एलिमेंट के लुक को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, उन्हें मौजूदा थीम के स्टैंडर्ड वेरिएशन से मैच करने के लिए स्टाइल किया जाता है. इसके बजाय, हार्डकोड की गई वैल्यू दी जाती है. स्टाइल एट्रिब्यूट का रेफ़रंस देने का मतलब है, "मौजूदा थीम में इस एट्रिब्यूट से तय की गई स्टाइल का इस्तेमाल करें."
स्टाइल एट्रिब्यूट का रिफ़रंस देने के लिए, नाम का सिंटैक्स सामान्य संसाधन फ़ॉर्मैट के जैसा ही होता है. हालांकि, "at" सिंबल (@) के बजाय, प्रश्न चिह्न (?) का इस्तेमाल करें. संसाधन टाइप वाला हिस्सा ज़रूरी नहीं है. इसलिए, रेफ़रंस का सिंटैक्स इस तरह है:
?[<package_name>:][<resource_type>/]<resource_name>
उदाहरण के लिए, सिस्टम थीम के सेकंडरी टेक्स्ट के रंग से मेल खाने के लिए, टेक्स्ट का रंग सेट करने के लिए किसी एट्रिब्यूट को इस तरह से रेफ़रंस किया जा सकता है:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
यहां, android:textColor एट्रिब्यूट, मौजूदा थीम में स्टाइल एट्रिब्यूट का नाम बताता है. Android अब इस विजेट में android:textColor की वैल्यू के तौर पर, android:textColorSecondary
style एट्रिब्यूट पर लागू की गई वैल्यू का इस्तेमाल करता है. सिस्टम रिसोर्स टूल को पता है कि इस कॉन्टेक्स्ट में एट्रिब्यूट रिसोर्स की ज़रूरत है. इसलिए, आपको टाइप के बारे में साफ़ तौर पर बताने की ज़रूरत नहीं है. टाइप ?android:attr/textColorSecondary है. attr टाइप को बाहर रखा जा सकता है.
ओरिजनल फ़ाइलें ऐक्सेस करना
हालांकि, ऐसा कम ही होता है, लेकिन आपको अपनी मूल फ़ाइलों और डायरेक्ट्री को ऐक्सेस करने की ज़रूरत पड़ सकती है. अगर ऐसा है, तो res/ में फ़ाइलें सेव करने की सुविधा आपके लिए काम नहीं करेगी. इसकी वजह यह है कि res/ से किसी संसाधन को सिर्फ़ संसाधन आईडी की मदद से पढ़ा जा सकता है. इसके बजाय, अपने संसाधनों को assets/ डायरेक्ट्री में सेव किया जा सकता है.
assets/ डायरेक्ट्री में सेव की गई फ़ाइलों को रिसॉर्स आईडी नहीं दिया जाता है. इसलिए, उन्हें R क्लास या XML रिसॉर्स से रेफ़रंस नहीं किया जा सकता. इसके बजाय, सामान्य फ़ाइल सिस्टम की तरह assets/ डायरेक्ट्री में मौजूद फ़ाइलों को क्वेरी किया जा सकता है. साथ ही, AssetManager का इस्तेमाल करके रॉ डेटा पढ़ा जा सकता है.
हालांकि, अगर आपको सिर्फ़ रॉ डेटा (जैसे कि वीडियो या ऑडियो फ़ाइल) को पढ़ने की सुविधा चाहिए, तो फ़ाइल को res/raw/ डायरेक्ट्री में सेव करें और openRawResource() का इस्तेमाल करके बाइट की स्ट्रीम पढ़ें.
प्लैटफ़ॉर्म के संसाधनों को ऐक्सेस करना
Android में कई स्टैंडर्ड संसाधन होते हैं, जैसे कि स्टाइल, थीम, और लेआउट. इन संसाधनों को ऐक्सेस करने के लिए, अपने संसाधन रेफ़रंस को android पैकेज के नाम के साथ क्वालिफ़ाई करें. उदाहरण के लिए, Android एक लेआउट रिसॉर्स उपलब्ध कराता है. इसका इस्तेमाल ListAdapter में मौजूद सूची आइटम के लिए किया जा सकता है:
Kotlin
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
Java
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
इस उदाहरण में, simple_list_item_1 एक लेआउट संसाधन है. इसे प्लैटफ़ॉर्म ने ListView में मौजूद आइटम के लिए तय किया है. सूची में शामिल आइटम के लिए, खुद का लेआउट बनाने के बजाय इसका इस्तेमाल किया जा सकता है.
संसाधनों के साथ डिवाइस की सबसे अच्छी कंपैटिबिलिटी उपलब्ध कराना
आपके ऐप्लिकेशन को अलग-अलग डिवाइस कॉन्फ़िगरेशन के साथ काम करने के लिए, यह बहुत ज़रूरी है कि आप अपने ऐप्लिकेशन में इस्तेमाल होने वाले हर तरह के संसाधन के लिए, डिफ़ॉल्ट संसाधन हमेशा उपलब्ध कराएं.
उदाहरण के लिए, अगर आपका ऐप्लिकेशन कई भाषाओं में काम करता है, तो हमेशा एक values/ डायरेक्ट्री शामिल करें. इसमें आपकी स्ट्रिंग सेव की जाती हैं. साथ ही, इसमें भाषा और देश/इलाके के हिसाब से क्वालिफ़ायर नहीं होना चाहिए. अगर आपने अपनी सभी स्ट्रिंग फ़ाइलों को ऐसी डायरेक्ट्री में रखा है जिनमें भाषा और देश/इलाके के हिसाब से क्वालिफ़ायर मौजूद है, तो आपके ऐप्लिकेशन के क्रैश होने की संभावना बढ़ जाती है. ऐसा तब होता है, जब ऐप्लिकेशन को किसी ऐसे डिवाइस पर चलाया जाता है जिसकी भाषा आपकी स्ट्रिंग के साथ काम नहीं करती.
जब तक डिफ़ॉल्ट values/ संसाधन उपलब्ध कराए जाते हैं, तब तक आपका ऐप्लिकेशन ठीक से काम करता है. भले ही, उपयोगकर्ता को ऐप्लिकेशन में इस्तेमाल की गई भाषा समझ न आए. क्रैश होने से बेहतर है.
इसी तरह, अगर स्क्रीन ओरिएंटेशन के आधार पर अलग-अलग लेआउट संसाधन उपलब्ध कराए जाते हैं, तो किसी एक ओरिएंटेशन को डिफ़ॉल्ट के तौर पर चुनें. उदाहरण के लिए, लैंडस्केप के लिए layout-land/ और पोर्ट्रेट के लिए layout-port/ में लेआउट संसाधन देने के बजाय, किसी एक को डिफ़ॉल्ट के तौर पर छोड़ दें. जैसे, लैंडस्केप के लिए layout/ और पोर्ट्रेट के लिए layout-port/.
डिफ़ॉल्ट संसाधन उपलब्ध कराना ज़रूरी है. ऐसा इसलिए, क्योंकि हो सकता है कि आपका ऐप्लिकेशन ऐसे कॉन्फ़िगरेशन पर काम करे जिसके बारे में आपने सोचा न हो. इसके अलावा, 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-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
मान लें कि डिवाइस का कॉन्फ़िगरेशन यह है:
Locale = en-GB
स्क्रीन ओरिएंटेशन = port
स्क्रीन पिक्सल डेंसिटी = hdpi
टचस्क्रीन टाइप = notouch
टेक्स्ट डालने का मुख्य तरीका = 12key
डिवाइस के कॉन्फ़िगरेशन की तुलना, उपलब्ध अन्य संसाधनों से करके Android, drawable-en-port से ड्रॉएबल चुनता है.
सिस्टम यह फ़ैसला इन लॉजिक के आधार पर लेता है कि किन संसाधनों का इस्तेमाल करना है:
दूसरी इमेज. Android, सबसे सही मैच करने वाले संसाधन को कैसे ढूंढता है, इसका फ़्लोचार्ट.
- ऐसी संसाधन फ़ाइलों को हटाना जो डिवाइस के कॉन्फ़िगरेशन के मुताबिक नहीं हैं.
drawable-fr-rCA/डायरेक्ट्री को हटा दिया गया है, क्योंकि यहen-GBके स्थानीय भाषा के हिसाब से सही नहीं है.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/अपवाद: स्क्रीन पिक्सल डेंसिटी एक ऐसा क्वालिफ़ायर है जिसे विरोधाभास की वजह से नहीं हटाया जाता. डिवाइस की स्क्रीन डेंसिटी hdpi होने के बावजूद,
drawable-port-ldpi/को नहीं हटाया गया है. ऐसा इसलिए, क्योंकि इस समय हर स्क्रीन डेंसिटी को मैच माना जाता है. जानकारी के लिए, स्क्रीन कंपैटिबिलिटी के बारे में खास जानकारी लेख पढ़ें. - सूची (टेबल 2) में, प्राथमिकता के हिसाब से दूसरे नंबर पर आने वाला क्वालिफ़ायर ढूंढें. (एमसीसी से शुरू करें.)
- क्या किसी संसाधन डायरेक्ट्री में यह क्वालिफ़ायर शामिल है?
- अगर जवाब 'नहीं' है, तो दूसरे चरण पर वापस जाएं और अगली ज़रूरी शर्त देखें. इस उदाहरण में, भाषा के क्वालिफ़ायर तक जवाब "नहीं" है.
- अगर हां, तो चौथे चरण पर जाएं.
- उन संसाधन डायरेक्ट्री को हटाएं जिनमें यह क्वालिफ़ायर शामिल नहीं है. इस उदाहरण में, सिस्टम उन सभी डायरेक्ट्री को हटा देता है जिनमें भाषा क्वालिफ़ायर शामिल नहीं है:
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/अपवाद: अगर सवाल में पूछा गया क्वालिफ़ायर, स्क्रीन की पिक्सल डेंसिटी है, तो Android उस विकल्प को चुनता है जो डिवाइस की स्क्रीन डेंसिटी से सबसे ज़्यादा मेल खाता है. आम तौर पर, Android बड़ी ओरिजनल इमेज को छोटा करने को प्राथमिकता देता है. ऐसा इसलिए, क्योंकि छोटी ओरिजनल इमेज को बड़ा करने पर उसकी क्वालिटी खराब हो सकती है. ज़्यादा जानकारी के लिए, स्क्रीन के साथ काम करने की सुविधा के बारे में खास जानकारी लेख पढ़ें.
- दूसरे, तीसरे, और चौथे चरण को तब तक दोहराएं, जब तक सिर्फ़ एक डायरेक्ट्री न बच जाए. इस उदाहरण में, स्क्रीन ओरिएंटेशन अगला क्वालिफ़ायर है, जिसके लिए कोई भी मैच मौजूद है.
इसलिए, जिन संसाधनों में स्क्रीन ओरिएंटेशन के बारे में नहीं बताया गया है उन्हें हटा दिया जाता है:
drawable-en/drawable-en-port/drawable-en-notouch-12key/बची हुई डायरेक्ट्री
drawable-en-portहै.
हालांकि, यह प्रोसेस अनुरोध किए गए हर संसाधन के लिए की जाती है, लेकिन सिस्टम इसके कुछ पहलुओं को ऑप्टिमाइज़ करता है. इस तरह के ऑप्टिमाइज़ेशन का एक उदाहरण यह है कि डिवाइस के कॉन्फ़िगरेशन के बारे में पता चलने के बाद, यह उन वैकल्पिक संसाधनों को हटा सकता है जो कभी मैच नहीं कर सकते. उदाहरण के लिए, अगर कॉन्फ़िगरेशन की भाषा अंग्रेज़ी है, तो भाषा क्वालिफ़ायर के तौर पर अंग्रेज़ी के अलावा कोई दूसरी भाषा सेट करने वाली कोई भी रिसॉर्स डायरेक्ट्री, कभी भी जांच किए गए रिसॉर्स के पूल में शामिल नहीं की जाती. हालांकि, भाषा क्वालिफ़ायर के बिना वाली रिसॉर्स डायरेक्ट्री अब भी शामिल की जाती है.
स्क्रीन के साइज़ के हिसाब से क्वालिफ़ायर के आधार पर संसाधन चुनते समय, सिस्टम ऐसे संसाधनों का इस्तेमाल करता है जिन्हें मौजूदा स्क्रीन से छोटी स्क्रीन के लिए डिज़ाइन किया गया है. ऐसा तब होता है, जब कोई ऐसा संसाधन उपलब्ध न हो जो स्क्रीन के साइज़ के हिसाब से बेहतर तरीके से मैच करता हो. उदाहरण के लिए, अगर ज़रूरी हो, तो बड़ी स्क्रीन पर सामान्य साइज़ की स्क्रीन के संसाधनों का इस्तेमाल किया जाता है.
हालांकि, अगर उपलब्ध संसाधन, मौजूदा स्क्रीन से बड़े हैं, तो सिस्टम उनका इस्तेमाल नहीं करता है. साथ ही, अगर कोई अन्य संसाधन, डिवाइस के कॉन्फ़िगरेशन से मेल नहीं खाता है, तो आपका ऐप्लिकेशन क्रैश हो जाता है. उदाहरण के लिए, ऐसा तब होता है, जब सभी लेआउट रिसॉर्स को xlarge क्वालिफ़ायर के साथ टैग किया गया हो, लेकिन डिवाइस की स्क्रीन सामान्य साइज़ की हो.
ध्यान दें: टेबल 2 में दिए गए क्वालिफ़ायर की प्राथमिकता, डिवाइस से पूरी तरह मेल खाने वाले क्वालिफ़ायर की संख्या से ज़्यादा अहम होती है. ऊपर दिए गए उदाहरण में, चौथे चरण में सूची में मौजूद आखिरी विकल्प में तीन क्वालिफ़ायर शामिल हैं. ये डिवाइस से पूरी तरह मेल खाते हैं (ओरिएंटेशन, टचस्क्रीन टाइप, और इनपुट का तरीका). वहीं, drawable-en में सिर्फ़ एक ऐसा पैरामीटर है जो मेल खाता है (भाषा). हालांकि, भाषा को इन अन्य क्वालिफ़ायर से ज़्यादा प्राथमिकता दी जाती है. इसलिए, drawable-port-notouch-12key को हटा दिया जाता है.