कुंजी एक एप्लिकेशन-विशिष्ट संसाधन आईडी होना चाहिए


145

मुझे यह अपवाद क्यों मिलता है?

05-18 20:29:38.044: ERROR/AndroidRuntime(5453): java.lang.IllegalArgumentException: The key must be an application-specific resource id.
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at android.view.View.setTag(View.java:7704)
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at com.mypkg.viewP.inflateRow(viewP.java:518)

प्रश्न में लाइन है:

((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);

और मैंने इसे इस प्रकार परिभाषित किया है:

private static final int TAG_ONLINE_ID = 1;

जवाबों:


55

टैग आईडी अद्वितीय होनी चाहिए, इसलिए यह चाहता है कि यह अद्वितीयता की गारंटी देने के लिए संसाधन फ़ाइल में बनाई गई आईडी हो।

यदि दृश्य में केवल एक टैग होगा, हालांकि आप बस कर सकते हैं

setTag(objContact.onlineid);

3
मुझे अभी भी पैटर्न नहीं मिला है। मैं पहले और अंतिम नाम को कहने के लिए दो टैग सेट करना चाहता हूं। मैं इन के लिए पूर्णांक आईडी को कहां परिभाषित करूं?
जेफरी ब्लाटमैन

7
आप किसी भी संसाधन का उपयोग कर सकते हैं - यहां तक ​​कि एक यादृच्छिक R.id.FOO भी लें जहां FOO आपके प्रोजेक्ट में कुछ आईडी है।
आर्टेम रसाकोवस्की

16
यूनिक टैग आईडी पाने का यह सबसे अच्छा तरीका है? वास्तव में Android?
jimmy0251

अरे, अगर मैं नहीं जानता कि कितने टैग हैं? क्योंकि मैं मॉडल में कुछ आंकड़ों के अनुसार विचार उत्पन्न करना चाहता हूं ....
jsina

एस्केर की समस्या का एक संभावित समाधान, लेकिन सबसे अच्छा समाधान नहीं है। उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए ...
गुस्से में 3

226

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

String.xml xml में दो विशिष्ट प्रविष्टि बनाने का प्रयास करें, "Firstname" और "दूसरा नाम" और उन्हें नीचे के रूप में उपयोग करें

imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");

129
इसे अपनी स्ट्रिंग्स में जोड़ें। xml फ़ाइल: <आइटम प्रकार = "आईडी" नाम = "TAG_ONLINE_ID" /> और आप एक नियमित आईडी संसाधन की तरह उपयोग कर सकते हैं: R.id.TAG_ONLINE_ID
एटिएन्सेन डेस

9
यह एक उत्तर होना चाहिए। यह अधिक सामान्य है।
आयरनबेलसम

2
@AjithMemana क्यों? जब एप्लिकेशन संकलित किया जाता है, तो strings.xml फ़ाइल प्रत्येक तत्व के लिए एक अद्वितीय इंट रिसोर्स आईडी प्रदान करती है। स्ट्रिंग तत्व के मूल्य को ध्यान में नहीं रखा जाता है।
अतुलम

1
धन्यवाद, यह इतना महान और उपयोगी है ... यदि आप उस टैग को प्राप्त करना चाहते हैं जिसे आपको v.getTag (R.string.name) जैसे स्ट्रिंग मानों तक पहुँचने की आवश्यकता है
Amt87

5
Res / मान निर्देशिका में बेहतर फ़ाइल नाम ids.xml बनाएँ और अपनी सभी विशिष्ट आईडी जोड़ें।
वोवहॉस्ट

146

मुझे पार्टी में थोड़ी देर हो गई है लेकिन मैं आज खुद इस समस्या पर अड़ गया हूं और सोचा था कि मैं भी इसका जवाब दूंगा। यह उत्तर अन्य उत्तरों के संकलन का एक सा होगा, लेकिन एक मोड़ के साथ। सबसे पहले, आईडी, जैसा कि दूसरों द्वारा इंगित किया गया है, आपके कोड में एक निरंतर परिभाषित नहीं किया जा सकता है (जैसे कि निजी स्थिर अंतिम int MYID = 123) या कोई अन्य इंट जिसे आप कहीं पर एक क्षेत्र के रूप में परिभाषित करते हैं।

आईडी को एक पूर्वनिर्धारित यूनिक आईडी होना चाहिए, जैसे आप उन स्ट्रिंग्स के लिए प्राप्त करते हैं जो आप मूल्यों / स्ट्रिंग्स में डालते हैं। xml (यानी R.string.mystring)। का संदर्भ लें http://developer.android.com/guide/topics/resources/available-resources.html और http://developer.android.com/guide/topics/resources/more-resources.html अधिक जानकारी के लिए।

मेरा सुझाव है कि आप मान / टैग.xml नामक एक नई फ़ाइल बनाएँ और लिखें:

    <resources xmlns:android="http://schemas.android.com/apk/res/android">
      <item name="TAG_ONLINE_ID" type="id"/>
    </resources>

मुझे लगता है कि EtienneSky ने सुझाव दिया कि स्ट्रिंग्स में इसे डालने के बजाय एक अलग फाइल बनाना बेहतर है।


14
आप इसे <item name="TAG_ONLINE_ID" type="id"/>सरल बनाने के लिए भी कर सकते हैं ।
बेनोइट डफेज

यही असली समाधान है; नौसिखिया नहीं "मुझे समझ नहीं आ रहा है कि मैं क्या कर रहा हूं, लेकिन यह हैक काम करता है" -सुधार
रोएल

ध्यान दें, कोड प्रयोग में उपयोग करने के लिए R.id..., और नहीं R.string.. याR.tags...
g2server

यह उपयोगी था और यहाँ एक और पोस्ट है जहाँ यह इसके उपयोग को दर्शाता है: stackoverflow.com/questions/28492493/…
prasad_

और सुनिश्चित करें कि आपने फाइल को वैल्यू में रखा है न कि xml फोल्डर में। :)
नंतोका

55

यह काम करेगा ...

यदि आपके पास अपनी कक्षा में 1 सेटटैग है, तो आप शीर्ष में घोषित किसी भी इंट, शायद स्थिर फाइनल का उपयोग कर सकते हैं।

समस्या तब आती है जब आपके पास अलग-अलग कुंजियों के साथ 2 या अधिक सेटटैग था। मेरा मतलब:

public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1)
setTag(KEY_2)
...

वह परिदृश्य गलत है। फिर आपको निम्नलिखित के साथ शायद ids.xml नामक मान फ़ाइल जोड़ने की आवश्यकता है:

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

फिर, अपनी कक्षा में, कॉल करें:

 ...
 setTag(R.id.resourceDrawable, KEY_1)
 setTag(R.id.imageURI, KEY_2)
 ...

नवागंतुकों के लिए सबसे अच्छा स्पष्टीकरण
रिचर्ड ले मेसुरियर

यह असली समाधान है: नौसिखिया हैक ठीक नहीं!
रोएल

8
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

कार्य करना चाहिए। Ceph3us से अधिक जानकारी :

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

स्रोत से:

public void setTag(int key, final Object tag) {
    // If the package id is 0x00 or 0x01, it's either an undefined package
    // or a framework id
    if ((key >>> 24) < 2) {
        throw new IllegalArgumentException("The key must be an application-specific "
                + "resource id.");
    }

    setKeyedTag(key, tag);
}

क्योंकि आईडी को आपकी R.java फ़ाइल में एक जेनरेट करना होगा।
स्टैकऑवरफ्लो

नहीं, यह नहीं है। यह 2 से अधिक होना है << 24, यह सब है।
एंटोन दुज़ेंको

खैर, 1 + 2 << 24, 2 + 2 << 24 आदि दृष्टिकोण वास्तव में काम करता है। एक अनियमित तय की तरह दिखता है। मुझे यह जानना पसंद है कि यह ऐसा क्यों है? उदाहरण के लिए, एंड्रॉइड आदि के भविष्य के संस्करणों में कोई जोखिम हैं? इसे एक स्थिरांक के रूप में परिभाषित करने के लिए दूर से स्मूथ है?
Jan Bergström

क्योंकि यह एंड्रॉइड एसडीके में हार्डकोड है। यह कभी नहीं बदलेगा क्योंकि अन्यथा सभी मौजूदा एंड्रॉइड ऐप काम करना बंद कर देंगे।
एंटोन दुजेंको

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

3

मैंने उपयोग किया है viewHolder.itemTitleTextView.getId()। लेकिन आप अपने संसाधनों में भी घोषणा कर सकते हैं: <item type="id" name="conversation_thread_id"/>



0

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

v.setTag(firstname + ";" + lastname);

... और उन्हें स्ट्रिंग स्ट्रिंग में विभाजित करके एक्सेस करें:

String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname

0

आप इसका उपयोग कर सकते हैं:

private static final int TAG_ONLINE_ID = View.generateViewId() + 2 << 24;

uniqness एप्लिकेशन-विशिष्ट संसाधन आईडी के लिए

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