2011-10-27 14 views
24

ठीक है, तो मैं समझता हूं कि टैग शामिल करने का तरीका कैसे उपयोग करें लेकिन मैंने एक समस्या में भाग लिया है।एकाधिक लेआउट उदाहरण बनाने के लिए टेम्पलेट के रूप में लेआउट का उपयोग कर एंड्रॉइड

असल में मैं एक्सएमएल में परिभाषित एक लेआउट रखना चाहता हूं जिसमें कुछ TextView एस और ImageView है। मैं फिर एक सरणी में पुनरावृत्ति करना चाहता हूं और एक सरणी में जो कुछ भी करता है (जो रनटाइम पर आबादी है) के आधार पर एक्सएमएल लेआउट के भीतर फ़ील्ड को पॉप्युलेट करना चाहता है। इस प्रकार एक्सएमएल लेआउट की कई प्रतियां बनाना और अद्वितीय डेटा वाले फ़ील्ड को पॉप्युलेट करना। अब मुझे नहीं पता कि आप इस LinearLayout को TextView एस और ImageView के भीतर इस तरह से फिर से उपयोग कैसे कर सकते हैं इसके भीतर एक निरंतर आईडी है और मुझे इस लेआउट की कई प्रतियां बनाने की आवश्यकता है।

वहाँ एक संसाधन बढ़ और उसके बाद इसकी एक प्रति, कि काम करेगा बनाने के लिए कोई तरीका है ... तो

LinearLayout one = new LinearLayout(inflater.inflate(R.layout.home, container, false)); 

^वहाँ दुर्भाग्य से ऐसा कोई निर्माता है।

यह एकमात्र अन्य तरीका है जो इसे सभी प्रोग्रामेटिक रूप से करना है, लेकिन मैं कोड के बजाय एक्सएमएल में विचारों और LinearLayout के गुणों को पसंद करना चाहता हूं। ऐसा लगता है कि मैं LinearLayout एक टेम्पलेट बनना चाहता हूं जिसे आप अनुमान लगा सकते हैं ... वास्तव में यह सुनिश्चित नहीं है कि यह संभव है या नहीं।

उत्तर

42

आप आसानी से ऐसा कर सकते हैं, आपको बस इसे तोड़ना होगा। सबसे पहले आप उस लेआउट को लोड करते हैं जिसे आप अपने गतिशील दृश्यों को सम्मिलित करना चाहते हैं। फिर आप अपना सबव्यूव बढ़ाते हैं और जितनी बार चाहें उतनी बार इसे पॉप्युलेट करते हैं। फिर आप अपने मूल लेआउट में दृश्य जोड़ते हैं, और अंत में गतिविधि के सामग्री दृश्य को मूल दृश्य में सेट करते हैं।

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, 
      null); 

    for (int i = 0; i < 3; i++) { 
     View custom = inflater.inflate(R.layout.custom, null); 
     TextView tv = (TextView) custom.findViewById(R.id.text); 
     tv.setText("Custom View " + i); 
     parent.addView(custom); 
    } 

    setContentView(parent); 

यहाँ main.xml फ़ाइल है कि मैं में डालने कर रहा हूँ:

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

</LinearLayout> 

और यहाँ custom.xml राय यह है कि मैं, बढ़ पॉप्युलेट और गतिशील है

यहाँ एक उदाहरण है सम्मिलित करें:

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

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="horizontal" > 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_launcher" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</LinearLayout> 

आशा है कि यह उदाहरण मदद करता है!

+0

धन्यवाद एक बहुत! यह इसे हल किया गया है ... मुझे लगता है कि मुझे अलग-अलग inflate (....) कॉल के आसपास अपना सिर लेने की जरूरत है। – gunboatmedia

+1

धन्यवाद! Inflater का अच्छा उदाहरण भी! –

+1

क्या inflator.inflate() प्रत्येक पुनरावृत्ति का उपयोग करने के बजाय लूप के दौरान लेआउट की प्रतिलिपि बनाने का कोई तरीका है? ऐसा लगता है कि प्रतिलिपि बनाने की तुलना में बढ़ाना बहुत महंगा है। –

7

annyone करने के लिए अभी भी एक ऐसी ही समाधान की तलाश में, जाहिरा तौर पर आप भी एक्सएमएल में सीधे include का उपयोग करें और अभी भी कोड में उन्हें करने में सक्षम हो सकते हैं:

LinearLayout row1 = (LinearLayout) findViewById(R.id.row1) 
TextView text1 = row1.findViewById(R.id.text); 

LinearLayout row2 = (LinearLayout) findViewById(R.id.row2) 
TextView text2 = row2.findViewById(R.id.text); 

स्रोत: Romain Guy

संबंधित मुद्दे