2013-10-23 9 views
8

मैं @+id और @id बीच का अंतर जानना (इस accepted answer देखें)। हालांकि, मुझे हमेशा यह महसूस होता है कि जब मैं @+id में '+' लिखता हूं तो मैं एएपीटी कंपाइलर का काम कर रहा हूं।@id के बजाय @ + id का उपयोग करना क्यों आवश्यक है?

एक कारण संसाधन संकलक से ही अनुमान नहीं लगा सकता एक पहचानकर्ता बनाया जाना चाहिए अगर या बस पुन: उपयोग किया है? एक अंतर्निहित हैशटेबल संरचना नौकरी करेगी: एक ही आईडी वाला प्रत्येक संसाधन एक ही बाल्टी में जाता है, और यदि कुंजी मौजूद नहीं है, तो बस इसे बनाएं।

+0

http://stackoverflow.com/questions/5025910/difference-between-id-and-id-in-android - यह – N20084753

+0

@ N20084753 देखें, उसने पहले से ही ओपी में इसका उल्लेख किया है। – Piovezan

+0

@ एन 20084753 यह लिंक मैंने पहली वाक्य में दिया था। यह अंतर बताता है लेकिन जवाब नहीं देता है कि '+' को स्वचालित रूप से एएपीटी द्वारा क्यों नहीं जोड़ा जा सकता है। –

उत्तर

0

@ + आईडी के साथ आप आर। जावा में आईडी जोड़ रहे हैं जो आपको जावा कक्षाओं से संदर्भित करने की अनुमति देता है जबकि @id आप नहीं हैं। आप केवल @id का उपयोग कर सकते हैं यदि विशिष्ट आईडी पहले ही बनाई गई है और आप इसे किसी अन्य दृश्य में संदर्भित कर रहे हैं उदा। android:layout_below="@id/some_id"

+1

धन्यवाद, लेकिन जैसा कि मैंने कहा, मुझे वह सब पता है। प्रश्न यह है कि प्लस-प्रतीक आवश्यक क्यों है। यह संकलक के लिए यह बहुत आसान होना चाहिए कि पहचानकर्ता पहले से मौजूद है या नहीं, इसलिए मुझे समझ में नहीं आता कि मुझे इसे जानकारी का यह टुकड़ा क्यों देना चाहिए। –

1

शायद संकलक 'दाएं' और 'गलत' आईडी के बीच अंतर करने में सक्षम नहीं होगा। अगर उसे एक नई आईडी मिलती है (यानी वह अंतर्निहित हैशटेबल में नहीं है), तो यह हमेशा इसे सही, नई आईडी मानता है। यह एक वास्तविक नई आईडी और एक गलत टाइप आईडी के बीच अंतर करने में सक्षम नहीं होगा।

+0

शायद, लेकिन परिणाम यह है कि कई देव हर जगह @ + आईडी का उपयोग करते हैं, क्योंकि आईडी पहले से परिभाषित होने पर कोई त्रुटि नहीं है, और सब कुछ ठीक काम करता है। इसका अर्थ यह है कि यदि आईडी पहले से मौजूद है, तो कंपाइलर परीक्षण, लेकिन यदि यह अस्तित्व में नहीं है, तो वह पागल है। –

1

मैं कल्पना कर सकता हूं कि यह प्रोग्रामर की मदद करना है।

यदि आपको @ + आईडी निर्माण की आवश्यकता नहीं है तो सभी @id संदर्भ/निर्माण मान्य होंगे, तो त्रुटि को ट्रैक करना मुश्किल होगा, क्योंकि संकलक गलत संदर्भों में विफल नहीं होगा (जैसा कि यह बस होगा टाइपो आईडी का निर्माण)।

अलग तरह से रखो, सब आईडी संदर्भ त्रुटियों रनटाइम पर खोज की जा करने के लिए होगा।

संपादित करें:

Maybe, but the result is that many devs use @+id everywhere, since there is no error if the id is already defined, and everything works just fine. That means the compiler tests if the id already exist, but not if it does not exist, that's crazy 

तब उन डेवलपर्स imo @ + आईडी निर्माण का दुरुपयोग कर रहे हैं:

बस अपनी टिप्पणी के बारे Piovezan द्वारा समान जवाब देखा,।

@ + id और @id के बीच अंतर करने का विकल्प अभी भी बेहतर है (क्योंकि उन लोगों के लिए जो @ + आईडी का दुरुपयोग नहीं करते हैं) को संकलक को गलत संदर्भों पर संकलन समय त्रुटि देने का मौका है ।

EDIT2

और टिप्पणी संबोधित करने के लिए:

That's the link I gave in the first sentence. It explains the difference but does not answer why the '+' cannot be automatically infered by AAPT 

मेरा मानना ​​है कि यह कर सकते हैं, यह सिर्फ ऊपर तर्क (मेरा मानना ​​है) की वजह से नहीं है।

+0

देवताओं की मदद करने के उद्देश्य से ऐसा करना वास्तव में एक संभावना है। हालांकि, ग्रहण डिजाइनर में कुछ यूआई तत्वों को खींचने और छोड़ने का प्रयास करें, और आप देखेंगे कि यह हर जगह @ + आईडी का उपयोग करता है! चूंकि यह एक आधिकारिक एंड्रॉइड टूल है, इसलिए मुझे यह व्यवहार अजीब लगता है, क्योंकि अधिकांश नए उपयोगकर्ता उस डिजाइनर का उपयोग करेंगे, और सीखने के लिए कोड देखेंगे। –

+0

मैं आपका बिंदु देख सकता हूं लेकिन चूंकि यह एक उपकरण है, यह निश्चित रूप से मान्य संदर्भ उत्पन्न करेगा और आपके पास @ + आईडी (उनके अनुमान के लिए सरल) का उपयोग करने का कारण हो सकता है। नीचे की रेखा, उन्हें संकलन समय की मदद की ज़रूरत नहीं है जो @id लाता है। – cYrixmorten

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