2010-08-23 21 views
7

मैं जेनरेट आर फ़ाइल में सभी फ़ील्ड के माध्यम से पुन: सक्रिय करने में सक्षम होना चाहता हूं।एंड्रॉइड: संसाधन आईडी के माध्यम से प्रोग्रामेटिक रूप से पुनरावृत्त

कुछ की तरह:

for(int id : R.id.getAllFields()){ 
//Do something with id, like create a view for each image 
} 

मैं प्रतिबिंब की कोशिश की है, लेकिन मैं एक विशिष्ट आंतरिक वर्ग कि आर क्लास के भीतर निहित है लोड करने के लिए नहीं कर पा रहे। तो, उदाहरण के लिए, यह मेरे लिए काम करेगा नहीं:

Class c = Class.forName("packageName.R.id") 

मैं आर वर्ग पर ही प्रदर्शित कर सकते हैं, लेकिन मैं आईडी वर्ग के भीतर क्षेत्रों की जरूरत है।

मैंने संसाधन वर्ग को देखने का भी प्रयास किया, लेकिन वहां कुछ भी नहीं मिला। उस स्थिति में, ऐसा लगता है कि आप संसाधन आईडी ले सकते हैं और उस आईडी का स्ट्रिंग नाम प्राप्त कर सकते हैं, या स्ट्रिंग नाम ले सकते हैं और संबंधित संसाधन आईडी प्राप्त कर सकते हैं। मुझे कुछ भी नहीं मिला:

int[] Resources.getAllResourceIDs() 

शायद मैं इस गलत के बारे में जा रहा हूं। या हो सकता है मैं, उदा, उन सब को हाथ से टाइप करने लड़ने नहीं करना चाहिए, .:

int[] myIds = {R.id.firstResource, R.id.secondResource} 

यह दृष्टिकोण जब मेरे यूआई डिजाइनर के साथ काम कर के रूप में लचीला नहीं होने का नकारात्मक पक्ष है। जब भी वह एक्सएमएल फ़ाइल में एक नया संसाधन जोड़ता है, तो मुझे कोड अपडेट करना होगा। स्पष्ट रूप से बहुत दर्दनाक नहीं है, लेकिन यह अभी भी अच्छा होगा और ऐसा लगता है कि यह करने योग्य होना चाहिए।

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

नीचे के बारे में ViewGroup.getChildCount()/ViewGroup.getChildAt() ठीक काम करता है जवाब। लेकिन, मुझे अपने एक्सएमएल व्यू ग्रुप/लेआउट को तुरंत चालू करने का एक तरीका भी ढूंढना पड़ा। आप एक आंतरिक वर्ग पर प्रतिबिंब का उपयोग कर सकते

LayoutInflater li = MyActivity.getLayoutInflater(); 
ViewGroup vg = (ViewGroup) li.inflate(R.layout.main, null); 
+0

मैं यह नहीं कह रहा हूँ इस snarky होने के लिए लेकिन IMHO सच है कि आप आप से पूछना करने के लिए इस सवाल का मतलब है कि आप शायद कर रहे हैं की जरूरत महसूस करते हैं कि कुछ गलत। क्या आप इसे करने के लिए अपने उपयोग के मामले में विस्तार कर सकते हैं। मैं किसी भी कारण से नहीं सोच सकता कि मैं अपने पूरे एप्लिकेशन में परिभाषित सभी आईडी की पहुंच क्यों लेना चाहता हूं। – Qberticus

+1

मैं सभी आईडी का उपयोग नहीं करना चाहता, बल्कि, सभी संसाधन आईडी का एक निश्चित नाम (उदा। R.imageViewIds) के अंतर्गत है। इस तरह, मेरे कोड में, मैं एक ईवेंट श्रोता या लूप के लिए उनमें से प्रत्येक में जो कुछ भी जोड़ सकता हूं।मेरे यूआई में कई इमेज व्यू होंगे जो सभी घटनाओं का जवाब देंगे, और यह अच्छा होगा अगर मैं उन सभी छवि दृश्यों को बिना किसी कोड-कोडिंग के नाम (उदाहरण के लिए IView1.setListener (myListener); IView2.setListener (myListener));) इसके अलावा, अगर मेरा यूआई डिजाइनर एक्सएमएल फ़ाइल में चीजों का नाम बदलने का फैसला करता है तो मुझे अपने कोड को दोबारा नहीं करना पड़ेगा। –

उत्तर

5

मेरी टिप्पणी के आपके उत्तर में मुझे यह देखने में मदद मिली कि आप क्या करने की कोशिश कर रहे हैं।

आप शायद ViewGroup#getChildAt और ViewGroup#getChildCount पाश करने के लिए विभिन्न ViewGroup रों के माध्यम से अपने दृश्य पदानुक्रम में इस्तेमाल करते हैं और वापस आ View रों पर instanceof जांच कर सकते हैं। फिर आप बच्चे के विचारों के प्रकार और जहां वे आपके पदानुक्रम में हैं, के आधार पर जो कुछ भी आप चाहते हैं वह कर सकते हैं।

+0

यह टिकट लगता है! स्पष्टीकरण की खुशी ने मदद की। मेरे लेआउट के बच्चों के विचारों तक पहुंचने के लिए यह मेरे दिमाग को पार नहीं कर पाया था। अंतर्दृष्टि के लिए धन्यवाद एक गुच्छा। –

+0

एक कोड नमूना: http://stackoverflow.com/questions/4184889/android-refer-to-custom-views-in-a-loop/4185818#4185818 –

2

, लेकिन वाक्य रचना packagename.R $ आईडी है: ऐसा करने के लिए, की तरह कुछ प्रयास करें। ध्यान दें कि प्रतिबिंब बहुत धीमा हो सकता है और आपको वास्तव में इसका उपयोग करने से बचना चाहिए।

+0

मैं सोच रहा था कि प्रतिबिंब बहुत महंगा हो सकता है, और कुछ वस्तुओं को हाथ से कोड न करने की सुविधा के लिए इसके लायक नहीं है। मैं उम्मीद कर रहा था कि इन आईडी तक पहुंचने के कुछ अंतर्निर्मित, गैर-रिलेक्शन-आधारित तरीके थे क्योंकि यह एक सामान्य पर्याप्त परिदृश्य की तरह लगता है। कम से कम, आंतरिक कक्षाओं पर प्रतिबिंबित करने पर वाक्यविन्यास के लिए धन्यवाद। यह जानना उपयोगी है। –

5

मैंने पाया कि "कक्षा .forName (getPackageName() +" आर $ स्ट्रिंग ");" आपको स्ट्रिंग संसाधनों तक पहुंच प्रदान कर सकता है और आईडी, ड्रॉइंग, एक्स्ट के लिए भी काम करना चाहिए।

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


import java.lang.reflect.Field; 

import android.util.Log; 

public class ResourceUtil { 

    /** 
    * Finds the resource ID for the current application's resources. 
    * @param Rclass Resource class to find resource in. 
    * Example: R.string.class, R.layout.class, R.drawable.class 
    * @param name Name of the resource to search for. 
    * @return The id of the resource or -1 if not found. 
    */ 
    public static int getResourceByName(Class<?> Rclass, String name) { 
     int id = -1; 
     try { 
      if (Rclass != null) { 
       final Field field = Rclass.getField(name); 
       if (field != null) 
        id = field.getInt(null); 
      } 
     } catch (final Exception e) { 
      Log.e("GET_RESOURCE_BY_NAME: ", e.toString()); 
      e.printStackTrace(); 
     } 
     return id; 
    } 
} 
संबंधित मुद्दे