लेआउट के साथ एक दृश्य को कैसे फुलाया जाए


221

मेरे पास XML में एक लेआउट परिभाषित है। इसमें यह भी शामिल है:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

मैं अन्य XML लेआउट फ़ाइल के साथ इस RelativeView को बढ़ाना चाहूंगा। मैं एक स्थिति के आधार पर विभिन्न लेआउट का उपयोग कर सकता हूं। मैं इसे कैसे करूं? मैं के विभिन्न रूपों की कोशिश कर रहा था

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

लेकिन उनमें से किसी ने भी ठीक काम नहीं किया।

जवाबों:


390

मुझे यकीन नहीं है कि मैंने आपके प्रश्न का पालन किया है- क्या आप RelativeLayout को एक बच्चा दृश्य संलग्न करने की कोशिश कर रहे हैं? यदि आप कुछ करना चाहते हैं:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
मुझे एक त्रुटि मिलती है: 02-25 22: 21: 19.324: ERROR / AndroidRuntime (865): इसके कारण: java.lang.IllegalStateException: निर्दिष्ट बच्चे के पास पहले से ही एक माता-पिता हैं। आपको पहले बच्चे के माता-पिता पर removeView () को कॉल करना होगा।
मिशल डोमेल

27
बस अब यह कोशिश की, मुझे ज़रूरत थी: बच्चे को देखें = getLayoutInflater ()। फुलाएँ (R.layout.child, null);
जेम्स

3
समस्या कोड नहीं है। कोड का पालन करना काफी आसान है। आप xml फ़ाइल कहाँ बनाते हैं प्रकार एक थीम शैली संसाधन है? समस्या मुझे लगता है कि लोगों ने मुझे शामिल किया है जहां हम इस xml फ़ाइल को रख रहे हैं
Lpc_dark

15
यह सही नहीं है। : - इस्तेमाल किया जाना चाहिए inflater की 3-परम संस्करण यहाँ क्यों है doubleencore.com/2013/05/layout-inflation-as-intended
निक कार्डोसो

3
जवाब गलत है, भले ही यह काम करता हो। कृपया पहले, इस पोस्ट possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

आप एक XML संसाधन फुलाते हैं। लेआउटइन्फ़्लेटर डॉक्टर देखें ।

यदि आपका लेआउट mylayout.xml में है , तो आप कुछ ऐसा करेंगे:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
मेरा मुख्य विचार फुलाया गया है। समस्या यह है कि मैं इसका हिस्सा अन्य XML फ़ाइल से बढ़ाना चाहता हूं। यह आइटम RelativeLayout बड़े लेआउट का हिस्सा है और मैं इसे किसी अन्य XML फ़ाइल से लेआउट के साथ भरना चाहता हूं।
मिशैल डिमेल

। हम मैं माफी चाहता हूँ तो मैं कोई सुराग नहीं :( है आप की तरह <शामिल करें> कुछ प्रयोग कर रहे हैं अपने मुख्य दृश्य के अन्य लेआउट शामिल करने के लिए?
ccheneson

नहीं, यह सरल लेआउट है। मुझे लगता है कि मैं अपने तत्वों को प्रोग्रामिक रूप से जोड़ूंगा - बिना XML के। सहायता के लिए धन्यवाद!
मिशल डोमेल

27

हालांकि देर से जवाब, लेकिन इसे प्राप्त करने के लिए उस एक तरीके को जोड़ना चाहेंगे

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

जहां itemमाता-पिता लेआउट जहां एक बच्चे के लेआउट जोड़ना चाहते है।


(बाद में अभी भी) मुझे आपके उत्तर को लागू करने में कठिनाई हो रही है। मैंने आपके द्वारा उपर्युक्त कोड की कोशिश की, लेकिन 'आइटम' को 'R.layout.activity_layout' के साथ बदल दिया है। मुझे "" (int, int) पर कोई लागू विधि नहीं मिल रही है "" क्या मैं आपके विचारों के लिए आपको परेशान कर सकता हूं?
काइल

1
@ केश - बाद में भी। आप Rकिसी ऑब्जेक्ट के संदर्भ के रूप में संसाधनों का उपयोग नहीं कर सकते , वे बस intएस हैं। आपको findViewByIdइसे Rसंसाधन पास करने का उपयोग करना होगा, फिर इसे अपनी इच्छित वस्तु पर लिखें। फिर आप इसे फंक्शन कॉल की तरह उपयोग कर सकते हैं inflate। (यानी। ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... तो आप itemऊपर की तरह उपयोग कर सकते हैं ।)
पिंप ट्राइज़किट

मुझे लगता है कि मैं ऊपर के उदाहरण में मेरे RelativeLayoutबजाय उपयोग करने के ViewGroupलिए तैयार हूं, क्योंकि आप बेस क्लास को तुरंत कर सकते हैं ViewGroup। 5 मिनट का एडिट नियम मुझे मिला। lol
पिंप ट्राइज़किट

क्या माता-पिता को छिपाना और केवल बच्चे के दृश्य को प्रदर्शित करना संभव है
NovusMobile

धन्यवाद, इस विधि ने मदद की जहाँ मैं पिछले उदाहरण में getContext () का उपयोग नहीं कर सकता क्योंकि मैं टुकड़ों का उपयोग कर रहा हूँ।
राइटहंडेडमेन्की

19

इसे जोड़ने में मददगार है, भले ही यह एक पुरानी पोस्ट है, कि अगर xml से फुलाए जा रहे बच्चे के दृश्य को व्यूग्रुप लेआउट में जोड़ा जाना है, तो आपको यह देखने के लिए किस प्रकार के व्यूग्रुप का एक क्लू के साथ फुलाया जाना चाहिए। में जोड़ा जाना है। पसंद:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

फुलाया विधि काफी अधिभार है और डॉक्स में उपयोग के इस हिस्से का वर्णन करता है। मुझे एक समस्या थी जहां xml से फुलाए गए एक दृश्य को माता-पिता में ठीक से संरेखित नहीं किया गया था जब तक कि मैंने इस प्रकार का परिवर्तन नहीं किया था।


अंत में, धन्यवाद :) यह एक एकल माता-पिता के लिए कई विचार जोड़ने की अनुमति देता है, लेकिन बिना लेआउटप्रैम के बारे में चिंता किए बिना - जो कि XML से पढ़े जाते हैं। बहुत बढ़िया!
साबो

13

यहां तक ​​कि सरल तरीके से उपयोग करना है

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

उपयोग करना View.inflate()सबसे अच्छा तरीका है, कोई भी अनावश्यक LayoutInflaterया कोई getSystemService(Context.LAYOUT_INFLATER_SERVICE)भी उपद्रव नहीं है! : D
वरुण

8

लेआउट मुद्रास्फीति

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

यदि आप ऐसी गतिविधि में नहीं हैं, तो आप क्लास from()से स्थैतिक विधि का उपयोग कर सकते हैं , या संदर्भ विधि से सेवा का अनुरोध कर सकते हैं:LayoutInflaterLayoutInflatergetSystemService()

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(मुझे पता है कि यह लगभग 4 साल पहले है लेकिन अभी भी ध्यान देने योग्य है)


4

अगर आप कई बार सिंगल व्यू जोड़ना चाहते हैं तो आपको इस्तेमाल करना होगा

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

अगर आपको पसंद है

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

तथा

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

तब यह सभी तैयार जोड़े गए दृश्य के अपवाद को फेंक देगा।


4

AttachToRoot को True पर सेट करें

जरा सोचें कि हमने XML लेआउट फ़ाइल में एक बटन निर्दिष्ट किया है जिसकी लेआउट चौड़ाई और लेआउट की ऊंचाई match_parent पर सेट है।

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

इस बटन पर क्लिक करें घटना हम इस गतिविधि पर लेआउट लेआउट करने के लिए कोड का पालन कर सकते हैं।

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

आशा है कि यह समाधान आपके लिए काम करता है।


3

इस कोड को आज़माएं:

  1. यदि आप अपना लेआउट बढ़ाना चाहते हैं:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. यदि आप अपने लेआउट को कंटेनर (मूल लेआउट) में बढ़ाना चाहते हैं:

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

इस अनोखी परिस्थिति के कारण, इस त्रुटि के साथ मेरे पास सबसे कठिन समय था, लेकिन आखिरकार एक समाधान मिल गया।

मेरी स्थिति: मैं एक अलग दृश्य (एक्सएमएल) का उपयोग कर रहा हूं WebView, जो एक है , तब खुलता है AlertDialogजब मैं अपने मुख्य गतिविधि दृश्य में एक बटन पर क्लिक करता हूं। लेकिन किसी तरह या कोई अन्य WebViewमुख्य गतिविधि दृश्य से संबंधित था (शायद इसलिए कि मैं यहां से संसाधन खींचता हूं), इसलिए सही होने से पहले मैंने इसे अपने को सौंपा AlertDialog(एक दृश्य के रूप में), मुझे अपने माता-पिता को प्राप्त करना था WebView, इसे एक में डाल दिया ViewGroup, फिर उस पर सभी विचारों को हटा दें ViewGroup। यह काम किया, और मेरी त्रुटि चली गई।

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... बाद में बाद में मैंने अपना लोड किया WebView...।

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

यदि आप RelativeLayout के लिए एक बच्चे को देखने की कोशिश कर रहे हैं? आप निम्नलिखित करके कर सकते हैं

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

कोटलिन के साथ, आप उपयोग कर सकते हैं:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

मैंने इसके लिए कोड के नीचे स्निपेट का उपयोग किया था और यह मेरे लिए काम करता है।

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.