2010-09-27 13 views
7

पर findViewById पार्म गतिशील या प्रोग्रामेटिक रूप से कैसे बनाएं I have एक XML लेआउट है जो टैबलेरो के भीतर टेक्स्टव्यू से बना ग्रिड प्रदर्शित करेगा। टेक्स्टव्यू नाम सेल00, सेल 01 आदि हैं। रनटाइम पर, मेरा प्रोग्राम निर्धारित करेगा कि कौन से सेल को बदलने की जरूरत है।रनटाइम

क्या कोई नाम प्रारूप प्रारूप प्राप्त करने का कोई तरीका है ताकि इसे रनटाइम पर findViewById विधि में पारित किया जा सके? उदाहरण के लिए, यदि सेल00 की आवश्यकता है, तो मैं इस कोड में पार्म कैसे उत्पन्न कर सकता हूं?

TextView currcell = (TextView) findViewById(R.id.cell00) 

की तरह "सेल" 00 संकलन नहीं है findViewById विधि एक स्ट्रिंग प्रकार स्वीकार नहीं करता है क्योंकि कुछ। मैं प्रोग्राम में हार्डकोड किए गए ग्रिड में प्रत्येक टेक्स्टव्यू नाम नहीं चाहता हूं - एक बेहतर तरीका होना चाहिए।

आपके द्वारा प्रदान की जा सकने वाली किसी भी मदद के लिए धन्यवाद।

+0

सिर्फ एक उत्सुक दृश्य पर एक टेबलव्यू का उपयोग करके आप जो कुछ हासिल करने की कोशिश कर रहे हैं, उससे उत्सुक हैं? – schwiz

+0

यह सरल पहली बार ऐप एक पहेली पहेली समाधान प्रदर्शित करेगा। ग्रिड बनाने का तरीका एकमात्र तरीका है जो टैबलेट के अंदर टेक्स्टव्यू के साथ है। टेक्स्टव्यू मुझे प्रत्येक सेल में डेटा दर्ज करने और कुछ विशेषताओं को प्राप्त करने के लिए HTML का उपयोग करने की अनुमति देता है। मैंने यह पता लगाने की कोशिश की कि पेशेवर क्रॉसवर्ड पहेली ग्रिड कैसे बनाए जाते हैं, लेकिन आखिरकार हार मान ली जाती है और छोड़ दिया जाता है। मुझे यकीन है कि दूसरों को मेरी तुलना में एक बेहतर विधि का उपयोग करें। मैं वास्तव में चाहता हूं कि मुझे पता है कि एक असली अच्छा दिखने वाला ग्रिड प्रकार टेम्पलेट कैसे बनाया जाए। – greenset

+0

@schwiz ग्रिड व्यू के बजाय टेबल लेआउट का उपयोग करने का एक कारण है, यदि आपको प्रत्येक पंक्ति में किसी विशेष संख्या की वस्तुओं की आवश्यकता है। एक ग्रिड व्यू सिर्फ प्रत्येक पंक्ति के अंत में सामग्री को लपेटता है, इसलिए पंक्ति में संख्या स्क्रीन के आकार के आधार पर अलग-अलग हो जाएगी। –

उत्तर

4

आप R.id में नामित चर के पूर्णांक मान को खोजने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

Class clazz = R.id.class; 
Field f = clazz.getField("cell" + "00"); 
int id = f.getInt(null); // pass in null, since field is a static field. 
TextView currcell = (TextView) findViewById(id); 

ध्यान रखें कि प्रतिबिंब धीमा हो सकता है। यदि आप इसे बहुत कुछ करते हैं, तो आप मूल्यों को कैश करना या अलग-अलग तरीके से आना चाहेंगे।

+0

बहुत उपयोगी। मैं सच में आपके समय की सराहना करता हूँ। मैंने कोड दर्ज किया है और एक साफ संकलन मिला है। मुझे हफ्ते पहले इस साइट पर आना चाहिए था। सुझाव के लिए – greenset

3
int id = getResources().getIdentifier("cell00", "id", getPackageName()); 
TextView currcell = (TextView) findViewById(id); 

माया के रास्ते की तरह कोड भी प्रतिबिंब का उपयोग करता है, इसलिए सावधान रहें।

+0

Ty। मैं यह देखने के लिए दोनों तरीकों की कोशिश कर रहा हूं कि मेरी ज़रूरतों के लिए कौन सा सबसे अच्छा काम करता है। – greenset