मैं प्रोग्राम को व्यावहारिक रूप से एक आईडी कैसे असाइन कर सकता हूं?


202

एक XML फ़ाइल में, हम एक आईडी को किसी व्यू की तरह असाइन कर सकते हैं android:id="@+id/something"और फिर कॉल कर सकते हैं findViewById(), लेकिन प्रोग्रामेटिक रूप से व्यू बनाते समय, मैं आईडी कैसे असाइन करूं?

मुझे लगता setId()है कि डिफ़ॉल्ट असाइनमेंट के समान नहीं है। setId()अतिरिक्त है।

क्या कोई मुझे सही कर सकता है?


1
सबसेट: यूनीक आईडी जेनरेट करने का तरीका: stackoverflow.com/questions/1714297/…
Ciro Santilli 病 generate generate generate 法轮功

जवाबों:


521

Android idअवलोकन

एंड्रॉइड idएक पूर्णांक है जो आमतौर पर विचारों की पहचान करने के लिए उपयोग किया जाता है; इसे idXML (जब संभव हो) और कोड के माध्यम से (प्रोग्रामेटिक रूप से) असाइन किया जा सकता है। (जैसे कि उपयोग करके उत्पन्न idXML- परिभाषित Views के लिए संदर्भ प्राप्त करने के लिए सबसे उपयोगी है )InflatersetContentView ।)

के idमाध्यम से असाइन करेंXML

  • android:id="@+id/Somename की एक विशेषता जोड़ें"अपने विचार ।
  • जब आपका एप्लिकेशन बनाया जाता है, तो android:idउसे एक अद्वितीय असाइन किया जाएगा int कोड में उपयोग के लिए ।
  • आपके संदर्भ android:idके intउपयोग करते हुए "कोड में मूल्यR.id. SomeName" (प्रभावी रूप से एक निरंतर।)
  • यह intबिल्ड से बिल्ड में बदल सकता है, इसलिए कभी भीgen/ पैकेज R.java/ नाम / आईडी से कॉपी न करें, बस " R.id.somename" का उपयोग करें ।
  • (इसके अलावा, XML में एक idअसाइन किए गए का Preferenceउपयोग तब नहीं किया जाता है जब इसके Preferenceउत्पन्न होते हैं View।)

idकोड के माध्यम से असाइन करें (प्रोग्रामेटिक रूप से)

  • मैन्युअल रूप से सेट idका उपयोग करनाsomeView.setId(Int);
  • intसकारात्मक होना चाहिए, लेकिन अन्यथा यह जो कुछ भी आप चाहते हैं हो सकता है arbitrary- है (पढ़ने अगर यह भयंकर है रहते हैं।)
  • उदाहरण के लिए, यदि आइटमों का प्रतिनिधित्व करने वाले कई दृश्य बनाते और क्रमांकित करते हैं, तो आप उनके आइटम नंबर का उपयोग कर सकते हैं।

की विशिष्टता idरों

  • XML-अनुदिष्ट ids अद्वितीय होगा।
  • कोड-असाइन किए गए idएस को अद्वितीय नहीं होना चाहिए
  • कोड-असाइन किए गए id(सैद्धांतिक रूप से) XML-Signign ids के साथ संघर्ष कर सकते हैं ।
  • idअगर सही ढंग से (पढ़ने के लिए) छोड़ दिया जाए तो ये परस्पर विरोधी बात नहीं करेंगे ।

कब और क्यों) परस्पर विरोधी idकोई फर्क नहीं पड़ता

  • findViewById(int)आपके द्वारा निर्दिष्ट दृश्य से दृश्य पदानुक्रम के माध्यम से पुनरावृत्ति गहराई-प्रथम पुनरावृति करेगा और पहले Viewमिलान के साथ इसे पाता है id
  • जब तक पदानुक्रम में idएक्सएमएल-परिभाषित से पहले कोई कोड-असाइन नहीं सौंपा idगया है, findViewById(R.id.somename)तब तक एक्सएमएल-परिभाषित व्यू को हमेशा वापस करेगा id

गतिशील रूप से दृश्य और नियत बनाना IDरों

  • लेआउट XML में, के ViewGroupसाथ एक खाली परिभाषित करें id
  • जैसे कि एक के LinearLayoutसाथ android:id="@+id/placeholder"
  • प्लेसहोल्डर पॉप्युलेट करने के लिए कोड का उपयोग करें ViewGroupके साथView s के ।
  • यदि आपको जरूरत है या चाहते हैं, तो idप्रत्येक दृश्य के लिए सुविधाजनक कोई भी असाइन करें ।
  • प्लेसहोल्डर का उपयोग करके इन बच्चों के विचारों को देखें ।findViewById (सुविधाजनक);

  • एपीआई 17 पेश किया गया है View.generateViewId()जो आपको एक विशिष्ट आईडी बनाने की अनुमति देता है।

यदि आप अपने विचारों के संदर्भों को आसपास रखना चाहते हैं , तो उन्हें getApplicationContext()तुरंत सुनिश्चित करें और प्रत्येक संदर्भ को शून्य में सेट करना सुनिश्चित करें onDestroy। जाहिरा तौर पर लीकActivity (फांसी पर इसे बाद है नष्ट हो जाता है) बेकार है .. :)

एक XML सुरक्षित रखें android:idकोड में उपयोग के लिए करें

एपीआई 17 पेश किया गया View.generateViewId() जो एक अद्वितीय आईडी बनाता है। (इसे इंगित करने के लिए टेक-चांस-मेक-चेंज के लिए धन्यवाद।) *

यदि आपका ViewGroupXML के माध्यम से परिभाषित नहीं किया जा सकता है (या आप इसे नहीं चाहते हैं) तो आप यह सुनिश्चित करने के लिए XML के माध्यम से आईडी आरक्षित कर सकते हैं कि यह अद्वितीय बना रहे:

यहाँ, मान / ids.xml एक रिवाज को परिभाषित करता है id:

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

फिर एक बार ViewGroup या View बन जाने के बाद, आप कस्टम आईडी संलग्न कर सकते हैं

myViewGroup.setId(R.id.reservedNamedId);

परस्पर विरोधी idउदाहरण

उदाहरण के रूप में स्पष्ट रूप से स्पष्टता के लिए, यह जांचने देता है idकि पर्दे के पीछे संघर्ष होने पर क्या होता है ।

लेआउट / mylayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/placeholder"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
</LinearLayout>

संघर्ष का अनुकरण करने के लिए, हमारे नवीनतम बिल्ड को असाइन किया गया R.id.placeholder( मान @+id/placeholder)int 12 ।।

इसके बाद, MyActivity.java परिभाषित करता है कुछ प्रोग्राम प्रोग्राम (कोड के माध्यम से) कहते हैं:

int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
    TextView tv = new TextView(this.getApplicationContext());
    // One new TextView will also be assigned an id==12:
    tv.setId(i);
    placeholder.addView(tv);
}

तो placeholderऔर हमारे नए TextViews में से एक दोनों idका 12 है! लेकिन यह वास्तव में एक समस्या नहीं है यदि हम प्लेसहोल्डर के बच्चे के विचारों को क्वेरी करते हैं:

// Will return a generated TextView:
 placeholder.findViewById(12);

// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12: 
Activity.this.findViewById(12);

*इतना बुरा नहीं


9
इस के अलावा, यह उपयोगी किसी के लिए समान समाधान कोडिंग परस्पर विरोधी आईडी के लिए View.generateViewId () API में> 17 के बारे में पता होना करने के लिए में हो सकता है
AllDayAmazing

ध्यान दें कि findViewByIdगहराई-पहले अन्वेषण करता है, इसलिए "जब तक कोई कोड-निर्दिष्ट आईडी नहीं हैं, जो पदानुक्रम में एक्सएमएल-परिभाषित आईडी के ऊपर निर्दिष्ट है" तकनीकी रूप से सही नहीं है; यह "ऊपर" के बजाय "पहले" है।
कारू

Android डेवलपर टूल के अधिक हाल के संस्करणों में, प्रोग्राम को मनमाने ढंग से मान पर सेट करना एक संकलक त्रुटि के रूप में चिह्नित किया जाएगा। मूल्य एक वास्तविक संसाधन आईडी होने की उम्मीद है।
थॉमसडब्ल्यू

मेरा मानना ​​है कि पांच साल पहले जब मैंने यह उत्तर दिया था तब भी यही स्थिति थी - इसीलिए कस्टम आईडी को परिभाषित किया जाना था ids.xml। सही मायने में मनमानी आईडी के लिए, View.generateViewId()(API 17) का उपयोग करें । (कृपया अपनी बात स्पष्ट करें यदि मैंने इसे याद किया है।)
कोडशेन

> (इसके अलावा, XML में एक वरीयता के लिए निर्दिष्ट एक आईडी का उपयोग तब नहीं किया जाता है जब वरीयता अपना दृश्य उत्पन्न करती है।) इसके बारे में बहुत रुचि रखते हैं। इससे मेरा कोड विरासत में मिलता है, PreferenceDialogFragmentCompatऐसा लगता है कि आईडी R.idलोगों के पदानुक्रम से मेल नहीं खाती है। इस तरह मुझे आईडी द्वारा दृश्य नहीं मिल रहा है।
20

6

आप बस इसके View.setId(integer)लिए उपयोग कर सकते हैं । XML में, भले ही आप स्ट्रिंग आईडी सेट कर रहे हों, यह पूर्णांक में परिवर्तित हो जाता है। इसके कारण, आप किसी भी (सकारात्मक) पूर्णांक का उपयोग Views प्रोग्राम जोड़ने के लिए कर सकते हैं।

Viewप्रलेखन के अनुसार

इस दृश्य के पदानुक्रम में पहचानकर्ता का विशिष्ट होना आवश्यक नहीं है। पहचानकर्ता एक सकारात्मक संख्या होनी चाहिए।

इसलिए आप अपनी पसंद के किसी भी सकारात्मक पूर्णांक का उपयोग कर सकते हैं, लेकिन इस मामले में समतुल्य आईडी के साथ कुछ विचार हो सकते हैं। यदि आप पदानुक्रम में कुछ दृश्य के लिए खोज करना चाहते हैं तो कुछ प्रमुख वस्तुओं के साथ सेटटैग पर काम करना आसान हो सकता है।

करने के लिए क्रेडिट इस जवाब


5

हां, आप setId(value)किसी भी दृश्य में किसी भी (सकारात्मक) पूर्णांक मान के साथ कॉल कर सकते हैं जो आपको पसंद है और फिर इसका उपयोग करके मूल कंटेनर में खोजें findViewById(value)। ध्यान दें कि यह setId()अलग-अलग भाई-बहनों के विचारों के लिए एक ही मूल्य के साथ कॉल करने के लिए मान्य है , लेकिन findViewById()केवल पहले एक को वापस करेगा।


1
ध्यान दें कि आपको शून्य से अधिक पूर्णांक का उपयोग करना होगा।
पीटर अज़ताई

हालांकि viewViewById (int) आपके द्वारा निर्दिष्ट दृश्य से दृश्य पदानुक्रम के माध्यम से पुनरावृत्ति करेगा, और यह पहले उत्तर में निर्दिष्ट मिलान आईडी के साथ मिलने वाला पहला दृश्य सबसे सटीक है।
अनिकेत ठाकुर

हाँ, findViewByIdएक ज्ञात पूर्वज को कॉल करना प्रदर्शन के कारणों के लिए एक अच्छा विचार है, लेकिन यह गारंटी नहीं देता है कि सही आईडी के साथ एक होने पर तत्काल बच्चा मिल जाएगा।
कारु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.