2010-10-28 21 views
33

मैं अपने यूआई को कई एक्सएमएल लेआउट में विघटित करना चाहता हूं। पहला वाला मुख्य लेआउट होगा, और अन्य सामग्री लेआउट होंगे।एंड्रॉइड: एक एक्सएमएल लेआउट गतिशील रूप से कैसे शामिल करें?

मैं यह निर्धारित करने में सक्षम होना चाहता हूं कि कौन सी content_layout को रन-टाइम पर गतिशील रूप से शामिल किया जाना चाहिए, इसलिए मैं अपनी XML फ़ाइल में "layout="@+layout/content_layout" सेट नहीं करना चाहता हूं।

यहाँ मेरी लेआउट हैं:

main_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="600dp" 
    android:layout_height="800dp" > 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" /> 

    <include /> <!-- I WANT TO INCLUDE MY CONTENT HERE --> 

    <Button 
     android:id="@+id/cancelButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Cancel" /> 

</RelativeLayout> 

content_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/whatever" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

content_layout2.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/whatever2" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

मैं कैसे कर सकते उस?

धन्यवाद!

उत्तर

36
<RelativeLayout android:id="@+id/rl" ... 

अपने कोड में:

// get your outer relative layout 
RelativeLayout rl = (RelativeLayout) findById(R.id.rl); 


// inflate content layout and add it to the relative layout as second child 
// add as second child, therefore pass index 1 (0,1,...) 

LayoutInflater layoutInflater = (LayoutInflater) 
     this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
rl.addView(1, layoutInflater.inflate(R.layout.content_layout, this, false)); 
+0

मैंने किसी अन्य मामले में addView का उपयोग करने का प्रयास किया, लेकिन यह दोनों लेआउट की तरह दिख रहा था जहां एक-दूसरे को सुपरपोज़ करना था। दूसरे बच्चे का मतलब दूसरे स्तर पर है, तो मेरे रिलेवेटिवआउट के ठीक नीचे? क्या मैं अभी भी एंड्रॉइड जैसे संदर्भों का उपयोग कर सकता हूं: layout_belowe = "@ + id/title" मेरी सामग्री लेआउट में, घटना अगर उन्हें एक ही XML फ़ाइल में परिभाषित नहीं किया गया है? यदि नहीं, तो वे कैसे जानते हैं कि इसे सही जगह पर कैसे डालना है? धन्यवाद – nbarraille

+0

यह जोड़ा जाएगा जहां आप प्रशंसा करते हैं (// मैं अपनी सामग्री को शामिल करना चाहता हूं ????)। जटिल लेआउट के लिए, आप getChildCount(), getChildAt() के माध्यम से हमेशा एक दृश्य (समूह) बच्चों के माध्यम से लूप कर सकते हैं, और जहां दृश्य चाहते हैं उसे जोड़ सकते हैं। इसके अलावा, आप कोड में view.setId() के माध्यम से एक आईडी सेट कर सकते हैं और फिर उसे देखें। लेकिन निश्चित रूप से यह आपके कोड में निरंतर होगा, R.id.someId के माध्यम से नहीं, क्योंकि जावा कोड के माध्यम से निर्दिष्ट आईडी आपकी आर फ़ाइल में नहीं है। –

+1

ठीक है, मुझे मिल गया, इंडेक्स 1 (दूसरा बच्चा) वास्तव में इसका मतलब है कि इसे शीर्षक और बटन के बीच डाला जाएगा, 0 शीर्षक से पहले होता, आदि ... धन्यवाद। – nbarraille

5

आप ViewStub का उपयोग करने का प्रयास कर सकते हैं और केवल यह बदल सकते हैं कि यह कौन सा लेआउट प्रोग्रामेटिक रूप से फुलाएगा।

This answer discusses using one ViewStub.

+1

हाँ, इस तरह मैं यह आम तौर पर करते हैं, लेकिन जाहिरा तौर पर, ViewStubs तत्वों के लिए आप अक्सर उपयोग नहीं करते इस्तेमाल किया जा करने वाले हैं। – nbarraille

+0

यदि आप केवल दो अलग-अलग प्रकार के सूची दृश्यों के बीच बदल रहे हैं, तो आप केवल उस एडाप्टर को बदल सकते हैं जो सूची दृश्य प्रोग्रामेटिक रूप से बाध्य करता है (और इसलिए विभिन्न सूची दृश्य आइटम XML का उपयोग करें)। –

+0

दुर्भाग्य से मेरे पास कई सामग्री लेआउट हैं, और उनमें से कुछ उससे अधिक जटिल हैं। – nbarraille

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