Android में "@ आईडी /" और "@ + आईडी /" के बीच अंतर


456

@id/और के बीच अंतर क्या है @+id/?

में @+id/धनात्मक चिह्न +का निर्देश एक नया संसाधन नाम बना सकते हैं और करने के लिए जोड़ने के लिए R.javaफ़ाइल लेकिन क्या बारे में @id/? के प्रलेखन से ID: जब एक Android संसाधन को संदर्भित IDकरते हैं, तो आपको प्लस प्रतीक की आवश्यकता नहीं है, लेकिन एंड्रॉइड पैकेज नामस्थान को जोड़ना चाहिए, जैसे:

android:id="@android:id/list"

लेकिन ग्रहण के नीचे की छवि किसी भी तरह का सुझाव नहीं देती है @android:id/

@ / आईडी और @ + / आईडी के लिए सुझाव दिखाने वाली छवि

कर रहे हैं @id/और @android:id/एक ही?


एंड्रॉइड डॉक्स से: (इसे खोजने के लिए हमेशा के लिए लिया गया, और मैं एक असंबंधित मुद्दे को देख रहा था) डेवलपर.
android.com/guide/topics/resources/…

जवाबों:


351

आप संदर्भित करते हैं Android resources, जो पहले से ही एंड्रॉइड सिस्टम में परिभाषित हैं, @android:id/..जबकि संसाधनों का उपयोग करने के लिए जिन्हें आपने अपने प्रोजेक्ट में परिभाषित / बनाया है, आप उपयोग करते हैं@id/..

और जानकारी

चैट में आपके स्पष्टीकरण के अनुसार, आपने कहा कि आपको इस तरह की समस्या है:

यदि हम इसका उपयोग करते हैं तो android:id="@id/layout_item_id"यह काम नहीं करता है। इसके बजाय @+id/काम करता है तो यहाँ क्या अंतर है? और वह मेरा मूल प्रश्न था।

ठीक है, यह संदर्भ पर निर्भर करता है, जब आप XML विशेषता का उपयोग कर रहे हैं android:id, तब आप एक नई आईडी निर्दिष्ट कर रहे हैं, और पार्सर को निर्देश दे रहे हैं (या इसे बिल्डर कहते हैं) एक नई प्रविष्टि बनाने के लिए R.java, इस प्रकार आपको करना होगा एक शामिल हैं+ संकेत करें।

जबकि दूसरे मामले में, जैसे android:layout_below="@id/myTextView", आप एक ऐसी आईडी का उल्लेख कर रहे हैं जो पहले ही बनाई जा चुकी है, इसलिए पार्सर इसे पहले से निर्मित आईडी से जोड़ता है R.java

अधिक जानकारी फिर से

जैसा कि आपने अपनी चैट में कहा था, ध्यान दें कि अगर आप जिस तत्व का उपयोग कर रहे हैं, उसके बाद यह लिखा गया है कि यह android:layout_below="@id/myTextView"आईडी से किसी तत्व को पहचान नहीं पाएगा myTextView


142
"अधिक जानकारी फिर से" के बारे में: आप इस स्थिति को परिभाषित कर सकते हैं android:layout_below="@+id/myTextView"और फिर तत्व को स्वयं के साथ परिभाषित कर सकते हैं android:id="@id/myTextView"
caw

1
@MarcoW जिसने मुझे बहुत मदद की। मुझे इस समस्या का समाधान खोजने में कठिनाई हो रही थी (या सही खोज प्रविष्टि तैयार करने के लिए)। मुझे लगता है कि यह अपने आप में एक सवाल + जवाब के लायक हो सकता है।
डेविड मिलर

धन्यवाद! मेरे पास एक ही समस्या थी, और प्रलेखन इस विषय के बारे में बहुत कुछ नहीं कहता है। लेकिन यह स्पष्ट है: हमारे यहाँ जो समस्या थी वह बार-बार नहीं आती है ...
caw

7
मैं हमेशा एंड्रॉइड पर @ + आईडी / का उपयोग करता हूं: आईडी और एंड्रॉइड: लेआउट_बेलो, क्या यह एक समस्या है?
मेलानके

4
@melanke: लाना +में layout_belowऔर साथ ही android:idवास्तव में ठीक है, के बाद से The '+' means to create the symbol if it doesn't already existजवाब के रूप में तन्मय मंडल उसकी अच्छा में उल्लेख किया है (अभी तक underrated)। उस वजह से, कोई नकारात्मक रनटाइम प्रभाव भी नहीं है (संभवतः संकलित समय में एक छोटी सी वृद्धि हालांकि ^ ^ है)।
लेविट

86

संसाधन चिह्न की अपनी सूची में आईडी जोड़ने के लिए + चिन्ह एक छोटा कट है। अन्यथा आपको उन्हें इस तरह से एक xml फ़ाइल में रखने की आवश्यकता है

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@ स्चविज़: और हम इसे अपने लेआउट में कैसे उपयोग कर सकते हैं?
विकास पाटीदार

7
कल्पना कीजिए कि आपके पास मेरे उत्तर में परिभाषित संसाधन फ़ाइल है, तो आपके लेआउट में आपके पास हो सकती है। <View android:id="@id/my_logo"/> यदि आपके पास मेरे ऊपर परिभाषित संसाधन फ़ाइल नहीं है, तो आपको इसे <View android:id="@+id/my_logo"/> नोट की तरह करने की आवश्यकता होगी : आपको केवल एक बार आईडी + करना होगा। इसलिए यदि आपने किसी अन्य लेआउट फ़ाइल में किया है तो देखें <android: id = "+ id / my_logo" /> आपको अगली बार जब आप लेआउट में उसी आईडी का उपयोग करते हैं तो आपको '+' वर्ण को शामिल करने की आवश्यकता नहीं होगी।
नाथन श्वानमैन

@schwiz: ठीक है, यह उपयोगी है लेकिन हमें उस फ़ाइल को कहां रखना है res/drawable/या res/layout/या उस फाइल res/values/का नाम क्या होगा? यदि आपके पास इस संबंध में कोई उपयोगी लिंक है तो कृपया यहाँ पोस्ट करें।
विकास पाटीदार

1
यहां आपके संसाधनों के लिए नामकरण परंपराओं आदि के बारे में जानने के लिए आपको सब कुछ है। आप फ़ाइल को रेस / मान / में डाल देंगे और कन्वेंशन को इसे आईडी नाम देना है लेकिन आप इसे जो चाहें कह सकते हैं। डेवलपर
.android.com/guide/topics/resources/…

46

कभी-कभी आप अपनी लेआउट फ़ाइलों में संदर्भ देखते हैं जैसे:

<listview id="@+id/android:list">

तथा

<listview id="@android:id/list">

क्या फर्क पड़ता है?

.. मुझे खुशी है कि आपने ☺ से पूछा

@+id/fooइसका मतलब है कि आप अपने आवेदन के नाम स्थान में फू नाम की एक आईडी बना रहे हैं। आप इसका उपयोग करके देख सकते हैं @id/foo@android:id/fooइसका मतलब है कि आप एंड्रॉइड नेमस्पेस में परिभाषित आईडी का उल्लेख कर रहे हैं।

'+' का अर्थ है कि अगर यह पहले से मौजूद नहीं है तो प्रतीक का निर्माण करना है। Android का संदर्भ देते समय आपको इसकी आवश्यकता नहीं है (और इसका उपयोग नहीं करना चाहिए): प्रतीक, क्योंकि वे पहले से ही आपके लिए प्लेटफ़ॉर्म द्वारा परिभाषित किए गए हैं और आप वैसे भी उस नामस्थान में अपना स्वयं का नहीं बना सकते हैं।

यह नामस्थान फ्रेमवर्क का नाम स्थान है। उदाहरण के लिए, आपको उपयोग करने की आवश्यकता है @android:id/listक्योंकि यह आईडी ढाँचा खोजने की अपेक्षा करता है .. (ढाँचा केवल Android नामस्थान में आईडी के बारे में जानता है।)

इस स्रोत से पूरी तरह से कॉपी किया गया


6
हूँश !! पूरा CTRL + C फिर CTRL + V। खुशी है कि आपने मूल पोस्ट का भी संदर्भ दिया। क्या यह आपका ब्लॉग है?
अमन आलम

अगर मुझे टाइप बटन के 1 लेआउट @ + आईडी / मायबटन में घोषित किया गया है, तो 2 आईडी में सिर्फ @ आईडी / मायबटन की तरह उपयोग किए जाने पर नया उदाहरण बनाने की आवश्यकता नहीं है। क्या यह सही है ?
हिरेन दबी

39

संक्षेप में

android:id="@+id/my_button"

+ आईडी प्लस साइन, संसाधनों में एक नई आईडी जोड़ने या बनाने के लिए Android को बताता है।

जबकि

android:layout_below="@id/my_button"

यह केवल पहले से निर्मित आईडी को संदर्भित करने में मदद करता है।


9

+संसाधन प्रकार से पहले धन चिह्न ( ) केवल तभी आवश्यक है जब आप पहली बार किसी संसाधन ID को परिभाषित कर रहे हों। जब आप एप्लिकेशन को संकलित करते हैं, तो एसडीके उपकरण आपकी परियोजना की R.javaफ़ाइल में एक नया संसाधन आईडी बनाने के लिए आईडी नाम का उपयोग करते हैं जो EditTextतत्व को संदर्भित करता है । इस तरह से एक बार घोषित की गई संसाधन आईडी के साथ, आईडी के अन्य संदर्भों को प्लस चिह्न की आवश्यकता नहीं है। प्लस साइन का उपयोग केवल तभी आवश्यक है जब एक नई संसाधन आईडी को निर्दिष्ट किया जाए और कंक्रीट संसाधनों जैसे स्ट्रिंग्स या लेआउट के लिए आवश्यक न हो। संसाधन ऑब्जेक्ट के बारे में अधिक जानकारी के लिए साइडबॉक्स देखें।

प्रेषक: https://developer.android.com/training/basics/firstapp/building-ui.html



6

से विकासकर्ता गाइड :

android:id="@+id/my_button"

@स्ट्रिंग की शुरुआत में एट-सिंबल ( ) इंगित करता है कि XML पार्सर को शेष आईडी स्ट्रिंग को पार्स और विस्तारित करना चाहिए और इसे आईडी संसाधन के रूप में पहचानना चाहिए। प्लस-सिंबल ( +) का अर्थ है कि यह एक नया संसाधन नाम है जिसे हमारे संसाधनों में ( R.javaफ़ाइल में) बनाया और जोड़ा जाना चाहिए । एंड्रॉइड फ्रेमवर्क द्वारा कई अन्य आईडी संसाधन प्रस्तुत किए जाते हैं। एंड्रॉइड संसाधन आईडी का संदर्भ देते समय, आपको प्लस-प्रतीक की आवश्यकता नहीं होती है, लेकिन androidपैकेज नामस्थान को जोड़ना चाहिए , जैसे:

android:id="@android:id/empty"


4

ग्रहण के साथ एक बग है जहां कभी-कभी यदि आपने अभी-अभी एक नया बनाया है @+id/.., तो प्रोजेक्ट को साफ-सुथरा बनाने के बाद भी इसे तुरंत R.java फाइल में नहीं जोड़ा जाएगा। समाधान ग्रहण को फिर से शुरू करना है।

मुझे लगता है कि इसे जल्द से जल्द हल किया जाना चाहिए, क्योंकि यह (और अनुभव से, होगा) कुछ डेवलपर्स को यह सोचकर भ्रमित कर सकता है कि उनके सिंटैक्स में कुछ गड़बड़ है, और इसे डिबग करने की कोशिश करें, भले ही वास्तव में डीबग करने के लिए कुछ भी न हो।


3
उन कारणों में से एक जो मैंने एंड्रॉइड स्टूडियो में स्विच किए और कभी पीछे मुड़कर नहीं देखा :) (मुझे पता है कि यह उस समय तक नहीं था जब आपने अपना उत्तर लिखा था)
कोनराड मोरावस्की

4

एंड्रॉइड कुछ फ़ाइलों का उपयोग करता है जिन्हें संसाधन कहा जाता है जहां XML फ़ाइलों के लिए मान संग्रहीत किए जाते हैं।

अब जब आप एक XML ऑब्जेक्ट के लिए @ id / का उपयोग करते हैं, तो यह उस आईडी को संदर्भित करने की कोशिश कर रहा है, जो पहले से ही मान फाइलों में पंजीकृत है। दूसरी ओर, जब आप @ + आईडी का उपयोग करते हैं, तो यह मानों की फाइलों में एक नई आईडी दर्ज करता है जैसा कि '+' प्रतीक द्वारा निहित है।

उम्मीद है की यह मदद करेगा :)।


4

@id/और @android:id/ऐसा ही नहीं है।

@id/अपने एप्लिकेशन में रेफ़रिंग आईडी, @android:id/एंड्रॉइड प्लेटफ़ॉर्म में एक आइटम संदर्भित करना।

ग्रहण गलत है।


योर कह रहे हैं कि @id/ referencing ID in your applicationलेकिन eclise Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')तब देता है जब हम इसका उपयोग एप्लिकेशन संसाधन को संदर्भित करने के लिए करते हैं। तो बीच क्या फर्क है @id/और @+id/? आप कैसे कह सकते हैं कि ग्रहण गलत है?
विकास पाटीदार

1
आपको @android: id सुझाव नहीं दिखाने के मामले में ग्रहण गलत है। और आप गलत हैं, अगर आप @ id / myId का उपयोग कर रहे हैं, तो इसे कहीं और @ + आईडी / myId के साथ घोषित किए बिना। सभी @ आईडी / xxx को आपके आवेदन में कहीं और घोषित किया जाना चाहिए।
ओलेगास

अपना स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है कि हमारे लेआउट तत्वों के संदर्भ के आधार पर सुझाव दिखाने के बजाय यहां ग्रहण गलत नहीं है। जैसा कि यह @id/केवल मामले में दिखाता हैRelativeLayout
विकास पाटीदार

2

के बीच अंतर @+idऔर @idहै:

  • @+idR.javaफ़ाइल में एक दृश्य के लिए एक आईडी बनाने के लिए प्रयोग किया जाता है ।
  • @id R.java फ़ाइल में दृश्य के लिए बनाई गई आईडी को संदर्भित करने के लिए उपयोग किया जाता है।

हम का उपयोग @+idकरते हैं android:id="", लेकिन क्या होगा यदि आईडी नहीं बनाई गई है और हम इसे बनाने से पहले उल्लेख कर रहे हैं (फॉरवर्ड रेफरेंसिंग)।

उस स्थिति में, हम @+idआईडी बनाने के लिए उपयोग करते हैं और दृश्य को परिभाषित करते समय हमें इसे संदर्भित करना होगा।

कृपया निम्न कोड देखें:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

उपरोक्त कोड में, स्पिनर के लिए आईडी @+id/spinner अन्य दृश्य में बनाई गई है और स्पिनर को परिभाषित करते समय हम ऊपर बनाई गई आईडी का उल्लेख कर रहे हैं।

इसलिए, यदि हमें दृश्य बनाने से पहले दृश्य का उपयोग कर रहे हैं, तो हमें आईडी बनानी होगी।


1

के बीच “@+id/”और “@id/”Android में अंतर

पहले एक का उपयोग IDविशेष यूआई घटक के निर्माण के लिए किया जाता है और दूसरे का उपयोग विशेष घटक को संदर्भित करने के लिए किया जाता है


1

यदि दृश्य आइटम एक ही ऑपरेशन करता है, तो आप @+idकिसी भी लेआउट में प्रत्येक प्रविष्टि के लिए उपयोग कर सकते हैं क्योंकि एकाधिक @+id/fooके संकलन के दौरान R.javaफ़ाइल केवल एक गणना बनाता है। उदाहरण के लिए, यदि मेरे पास प्रत्येक पृष्ठ पर एक सेव बटन है जो एक ही ऑपरेशन करता है, तो मैं android:id="@+id/button_save"प्रत्येक लेआउट में उपयोग करता हूं । R.java फ़ाइल में केवल बटन के लिए एक प्रविष्टि है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.