2012-04-04 18 views
32

एंड्रॉइड आर। जावा में एक्सएमएल फाइलों में परिभाषित संसाधनों तक पहुंच प्रदान करने के लिए प्रयोग किया जाता है। संसाधन तक पहुंचने के लिए हमें संसाधनों की आईडी में गुजरने वाली findViewById() विधि को आमंत्रित करने की आवश्यकता है।आर। जावा के पीछे अवधारणा क्या है?

यह वसंत के समान है जहां बीन्स को एक्सएमएल संदर्भ में परिभाषित किया जाता है और एप्लिकेशन संदर्भ का उपयोग करके लाया जाता है। context.getBean("beanId")

यह ढीले युग्मन प्रदान करता है क्योंकि सेम को बाहरी रूप से परिभाषित किया जाता है और कोड में संशोधन किए बिना बदला जा सकता है।

यह मुझे उलझन में डाल दिया है। हालांकि एंड्रॉइड वसंत के समान दिखता है, लेकिन इसका क्या फायदा है?

  1. वैसे भी एक मध्यवर्ती R.java होने की बात क्या है? संसाधन पाठक/एप्लिकेशन संदर्भ के उपयोग से हम सीधे एक्सएमएल से संसाधन प्राप्त नहीं कर सके। जैसे findViewById("resourceId")
  2. कोई ढीला युग्मन नहीं है। चूंकि आरजेवा में संदर्भ ऑटो-जेनरेट हो जाते हैं, इसलिए कोई एक संसाधन को कैसे हटा सकता है और एक नया लगा सकता है?
  3. यह किस डिजाइन पैटर्न का पालन करता है (यदि कोई है तो)?
  4. आईओसी (रॉबोगुइस जैसे) का उपयोग करके संसाधनों को इंजेक्शन देना बेहतर नहीं होगा? फिर Google ने हमें संसाधनों के साथ काम करने का एक व्यापक तरीका क्यों देने का फैसला किया?

मेरी अज्ञानता क्षमा करें। मैं एक नौसिखिया जावा डेवलपर हूं जो एक ही समय में बहुत सी चीजों की कोशिश कर रहा है। :-) सभी प्रतिक्रियाओं के लिए धन्यवाद।

+0

मैं सिर्फ दो बार अपने प्रश्न upwote करना चाहते हैं, यह एक बहुत ही दिलचस्प सवाल – fatiDev

उत्तर

18

android.R.java केवल एक्सएमएल आईडी संग्रहित नहीं हैं। इसमें संसाधनों तक पहुंच भी शामिल है - जैसे ड्रॉबल्स, लेआउट, स्ट्रिंग्स, एरे, और मूल रूप से जो कुछ भी आप संसाधनों में घोषित कर सकते हैं।

व्यक्तिगत रूप से मुझे लगता है कि ग्रहण का उपयोग करते समय यह उपयोगी होता है। मैं बस findViewById(R.id. टाइप कर सकता हूं और ग्रहण विकल्प चुनने के विकल्पों की सूची के साथ एक टूलटिप दिखाएगा।

हालांकि प्लेटफ़ॉर्म स्तर पर, मैं कहूंगा कि हार्डकोडेड आईडी चर संसाधनों की पहचान करने के लिए स्ट्रिंग का उपयोग करते समय त्रुटियों को रोकने में मदद करते हैं - प्रोग्रामिंग के दौरान डिबगबल योग्य हो सकता है (या रनटाइम के बजाए संकलन के दौरान)।

+5

अधिक सहमत नहीं हो सका है। मुझे लगता है कि संकलन समय की जांच इसे लायक बनाता है। संकलन समय सुरक्षा उन कारणों में से एक है जिन्हें मैं अन्य गतिशील भाषाओं पर जावा से प्यार करता हूं। :-) –

1

तुलना लगता है कुछ हद तकएक छोटा सा (वास्तव में) अजीब है, क्योंकि आप तथ्य है कि वे सामान करने के लिए नामित चीजें का उपयोग के आधार पर दो तंत्र की तुलना करें। संसाधन लोडिंग के लिए, उदाहरण के लिए, .Net दुनिया में संसाधन प्रबंधन कैसे किया जाता है, इस पर एक नज़र डालें।


यह संकलन समय पता चल सके कि संसाधन उपलब्ध है के लिए प्रदान करता है। क्योंकि यदि ऐसा नहीं है, तो R.java के अंदर एक स्थिर नहीं होगा जो इसके लिए इंगित करता है। वसंत उदाहरण में, आप कैसे सुनिश्चित कर सकते हैं कि beanId नामक एक बीन है? यह जांच के लिए प्रदान नहीं करता है कि यह सही है संसाधन के टाइप करें।

यह क्यों ढीला नहीं है? जब तक नए संसाधन का एक ही नाम होता है, तब तक यह स्थिर स्थिर स्थिरता उत्पन्न करेगा। वसंत में, आपको उसी बीन नाम का उपयोग करना होगा।

डिजाइन पैटर्न? कोई नहीं। यह संसाधनों का नामकरण करके केवल एक स्तर का संकेत जोड़ता है और फिर उन्हें केवल नाम से संदर्भित करता है, न कि उन्हें सीधे उनके वास्तविक स्थान से लोड करके।

दरअसल, संसाधन इंजेक्शन दिए गए हैं, क्योंकि संसाधन लोडिंग को स्थानीयकरण से निपटना चाहिए। एंड्रॉइड कैसे काम करता है इसके लिए here देखें; .Net दुनिया में, अतिरिक्त संस्कृतियां सैटेलाइट असेंबली में पैक की जाती हैं; resource manager वर्तमान संस्कृति के आधार पर सही लोड करेगा।

21

सबसे बड़ा लाभ स्थानीयकरण में है और अलग अलग स्क्रीन आकार के लिए वैकल्पिक संसाधन प्रदान करना।

जैसे आप एक स्ट्रिंग संसाधन R.string.myname हो सकता है यह एक /values-en/strings.xml में अंग्रेजी में परिभाषित किया जा सकता है और में /values-es/strings.xml

सिस्टम में स्पेनिश देखभाल या सही स्थान तुम सिर्फ @string/myname उपयोग करने की आवश्यकता पर निर्भर करता है फ़ाइल उठा होगा अपने कोड में अपनी लेआउट फ़ाइल या R.string.myname में।

इसी तरह आप

res/layout/mylayout.xml 
res/layout-land/mylayout.xml 

में परिभाषित अपने कोड में पोर्ट्रेट और लैंडस्केप के लिए दो लेआउट फ़ाइलों तुम सिर्फ R.layout.mylayout निर्दिष्ट करेगा लेआउट को बढ़ाने के लिए हो सकता था। संसाधन प्रबंधक डिवाइस लेआउट-भूमि में फ़ाइल को उठाता है यदि डिवाइस लैंडस्केप मोड में है।

मैन्युअल ऐसा करने से एक बुरा सपना हो सकता है - इसलिए आर फ़ाइल के लिए की जरूरत

0

यह भी संसाधनों के उपयोग में शामिल है - जैसे आईडी, ड्रॉएबल, लेआउट, तार, सरणियों, और मूल रूप से कुछ भी आप संसाधनों में घोषणा कर सकते हैं के रूप में ।

+1

स्टैक ओवरफ्लो में योगदान के लिए धन्यवाद। किसी प्रश्न का उत्तर देने के तरीके पर [सहायता केंद्र] (http://stackoverflow.com/help/how-to-answer) प्रविष्टि पढ़ने पर विचार करें। जैसा लिखा है, आपका उत्तर स्वयं के लिए एक पूर्ण उत्तर नहीं है। यह अन्य प्रश्नों के संदर्भ को संदर्भित करता है। आरजेवा में जो कुछ है, उसकी पूरी सूची बनाने पर विचार करें, न केवल अन्य पोस्टर छोड़ दें। –

संबंधित मुद्दे