2012-04-29 12 views
6

तो, मेरे पास कोड है जो एटमिक इंटेगर का उपयोग करके कई तत्वों के लिए आईडी उत्पन्न कर रहा है जो डिफ़ॉल्ट रूप से Integer.MAX_VALUE पर सेट है और प्रत्येक के साथ वहां से घटाया गया है देखें कि एक आईडी असाइन किया जाता है। तो जेनरेट आईडी के साथ पहला दृश्य Integer.MAX_VALUE - 1 होगा, दूसरा Integer.MAX_VALUE - 2 होगा, आदि। जिस समस्या से मुझे डर है, वह आरजेजा में एंड्रॉइड द्वारा उत्पन्न आईडी के साथ टकराव है।यह देखने के लिए जांच कर रहा है कि संसाधनों में कोई आईडी मौजूद है (R.id.something)

तो मेरा सवाल यह है कि मैं कैसे पहचान सकता हूं कि कोई आईडी पहले से उपयोग में है या नहीं, जब मैं आईडी उत्पन्न कर रहा हूं। मैं केवल 30 आईडी पर उत्पन्न कर रहा हूं, इसलिए यह एक बड़ी प्राथमिकता नहीं है जिसे मैं इसे जितना संभव हो सके बग मुक्त करना चाहता हूं।

उत्तर

9

निम्नलिखित कोड आपको पता चलेगा कि पहचानकर्ता एक आईडी है या नहीं।

static final String PACKAGE_ID = "com.your.package.here:id/" 
... 
... 
int id = <your random id here> 
String name = getResources().getResourceName(id); 
if (name == null || !name.startsWith(PACKAGE_ID)) { 
    // id is not an id used by a layout element. 
} 
+0

धन्यवाद के साथ जाने का फैसला किया! यह आशाजनक लग रहा है। मैंने getResources का उपयोग करने के बारे में भी सोचा नहीं था। मैं इसे आज़माउंगा। – Brandon

+0

@ ब्रैंडन, यदि आपके पास जोड़ने के लिए कुछ और है तो आपको अपना प्रश्न अपडेट करना चाहिए। अपने संपादन को देखते हुए हालांकि यह आपके अपने प्रश्न के उत्तर के रूप में भी बेहतर होगा! – Ben

+4

'name' कभी भी 'शून्य' नहीं होगा। इसके बजाय, पहचानकर्ता अमान्य है तो 'getResourceName()' 'resource.NotFoundException' को फेंक दिया जाएगा – sfera

0

बस एक विचार ... id पहले से ही उपयोग में है या नहीं, यह जांचने के लिए आप findViewById (int id) का उपयोग कर सकते हैं।

+2

जो केवल तभी काम करेगा जब संदर्भ विशिष्ट दृश्य पर सेट किया गया था कि आईडी स्थित था। दूसरे शब्दों में एक से अधिक दृश्य और विभिन्न आईडी के साथ जो कभी भी पहचान के रूप में काम नहीं करेगा। – MikeIsrael

1

R.id कक्षा के किसी ऑब्जेक्ट में जो भी तत्व मौजूद हैं, उसे एक्सेस करने के लिए आप Java Reflection API का उपयोग कर सकते हैं।

कोड इस तरह है:

Class<R.id> c = R.id.class; 

R.id object = new R.id(); 

Field[] fields = c.getDeclaredFields(); 

// Iterate through whatever fields R.id has 
for (Field field : fields) 
{ 
    field.setAccessible(true); 

    // I am just printing field name and value, you can place your checks here 

    System.out.println("Value of " + field.getName() + " : " + field.get(object)); 
} 
+0

ऐसा लगता है कि यह काम कर सकता है लेकिन मैंने @Jens उत्तर – Brandon

3

मैंने टिप्पणियों में बताए गए ऊपर से जेन्स का जवाब संशोधित किया है, नाम कभी भी शून्य नहीं होगा और इसके बजाय अपवाद फेंक दिया जाएगा।

private boolean isResourceIdInPackage(String packageName, int resId){ 
    if(packageName == null || resId == 0){ 
     return false; 
    } 

    Resources res = null; 
    if(packageName.equals(getPackageName())){ 
     res = getResources(); 
    }else{ 
     try{ 
      res = getPackageManager().getResourcesForApplication(packageName); 
     }catch(PackageManager.NameNotFoundException e){ 
      Log.w(TAG, packageName + "does not contain " + resId + " ... " + e.getMessage()); 
     } 
    } 

    if(res == null){ 
     return false; 
    } 

    return isResourceIdInResources(res, resId); 
} 

private boolean isResourceIdInResources(Resources res, int resId){ 

    try{    
     getResources().getResourceName(resId); 

     //Didn't catch so id is in res 
     return true; 

    }catch (Resources.NotFoundException e){ 
     return false; 
    } 
} 
संबंधित मुद्दे