एंड्रॉइड लेआउट रन टाइम पर एक और दृश्य के साथ एक दृश्य को प्रतिस्थापित करता है


175

मैं एक है xml-layout फ़ाइल दो textviews ए / बी और एक दृश्य सी मैं दो अन्य के साथ मुख्य xml-layout फ़ाइलों option1और option2। यह या तो लोड करने के लिए संभव है option1या option2सी में जावा के माध्यम से चलाने के समय में? यदि हां, तो मुझे किस फ़ंक्शन का उपयोग करना है?

जवाबों:


372

आप किसी भी समय किसी भी दृश्य को बदल सकते हैं।

int optionId = someExpression ? R.layout.option1 : R.layout.option2;

View C = findViewById(R.id.C);
ViewGroup parent = (ViewGroup) C.getParent();
int index = parent.indexOfChild(C);
parent.removeView(C);
C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

यदि आप पहले से मौजूद व्यू को बदलना नहीं चाहते हैं , लेकिन शुरुआती समय में विकल्प 1 / विकल्प 2 के बीच चयन करें, तो आप यह आसान कर सकते हैं: android:idपैरेंट लेआउट के लिए सेट करें और फिर:

ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

आपको विचार संरचना के आधार पर "इंडेक्स" को उचित मूल्य पर सेट करना होगा। आप ViewStub का उपयोग भी कर सकते हैं : View C के रूप में अपना C दृश्य जोड़ें और फिर:

ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();

इस तरह से आपको ऊपर "इंडेक्स" मान के बारे में चिंता करने की ज़रूरत नहीं होगी यदि आप अपने XML लेआउट का पुनर्गठन करना चाहते हैं।


क्या मुझे टुकड़ा निकालना चाहिए, या टुकड़ा भी हटा दिया जाएगा?
के - एसओ में विषाक्तता बढ़ रही है।

3
@KarlMorrison यह सवाल लगभग 4 साल पुराना है और इसका टुकड़ों से कोई लेना-देना नहीं है। मैं एक नया प्रश्न दर्ज करने का सुझाव देता हूं और / या इस पर ध्यान देता हूं android.app.FragmentTransactionऔर यह replace()विधि है।
लूपज ११'१४ को

यह अफ़सोस है कि आपका जवाब बहुत जटिल है - टिप्पणियों में - नौसिखियों के लिए एंड्रॉइड प्रोग्रामर :-(
एंटोनियो सेस्टो

2
@AntonioSesto क्या बहुत जटिल है? आप कहाँ उलझन में थे?
एडमएमसी 331

@ मेरे द्वारा मेरे द्वारा किए गए रेखाचित्र में मैं दिन-प्रतिदिन चित्र जोड़ना चाहता हूं। बाद में मैंने कुछ छवियों को लेआउट से हटा दिया। फिर मैं इसे अपने स्थान पर पुनर्स्थापित करना चाहता हूं जहां से मैंने हटा दिया है। इसका मतलब है कि मैं बच्चों के माता-पिता को हटाए बिना छवियों को जोड़ना चाहता हूं क्या आप मुझे hlep कर सकते हैं?
प्रियंकाचौहान

43

और अगर आप ऐसा बहुत बार, आप एक इस्तेमाल कर सकते हैं ViewSwitcher या एक ViewFlipper आसानी दृश्य प्रतिस्थापन के लिए।


हां, अगर वैकल्पिक विचारों का सवाल है, तो फ्लिपर / स्विचर का उपयोग करना बेहतर है
Zoombie

2
@ शील आदि, क्या आपने ViewSwitcher ट्यूटोरियल कोड का उपयोग करने की कोशिश की?
14

मुझे पता है कि यह पुराना है - लेकिन चेतावनी यह है कि एक ViewSwitcher दोनों दृश्यों को अपने आप में (एक फ्रेम-आउट) रखता है।
विक्रम बोधिचरला

यह अनुशंसा उत्तर होना चाहिए। सिर्फ एक तैयार किए गए अच्छी तरह से परीक्षण किए गए समाधान का उपयोग क्यों न करें।

3
private void replaceView(View oldV,View newV){
        ViewGroup par = (ViewGroup)oldV.getParent();
        if(par == null){return;}
        int i1 = par.indexOfChild(oldV);
        par.removeViewAt(i1);
        par.addView(newV,i1);
    }

6
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या कैसे और / या क्यों हल करता है, के बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा
frobinsonj

0

यह मेरे मामले में काम करता है, पुराने सेंसर और newSnsor - oldView और newView:

private void replaceSensors(View oldSensor, View newSensor) {
            ViewGroup parent = (ViewGroup) oldSensor.getParent();

            if (parent == null) {
                return;
            }

            int indexOldSensor = parent.indexOfChild(oldSensor);
            int indexNewSensor = parent.indexOfChild(newSensor);
            parent.removeView(oldSensor);
            parent.addView(oldSensor, indexNewSensor);
            parent.removeView(newSensor);
            parent.addView(newSensor, indexOldSensor);
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.