เค้าโครง Android แทนที่มุมมองด้วยมุมมองอื่นในเวลาทำงาน


175

ฉันมีxmlไฟล์ -layout หลักสอง textviews A / B และมุมมองที่ C. ฉันมีสองอื่น ๆxmlไฟล์ -layout และoption1 option2มันเป็นไปได้ที่จะโหลดอย่างใดอย่างหนึ่งoption1หรือoption2ในเวลาทำงานผ่าน Java เป็น C? ถ้าเป็นเช่นนั้นฉันต้องใช้ฟังก์ชั่นอะไร?

คำตอบ:


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 : เพิ่มมุมมอง C ของคุณเป็น ViewStub แล้ว:

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

ด้วยวิธีนี้คุณจะไม่ต้องกังวลกับค่า "ดัชนี" ด้านบนหากคุณต้องการปรับโครงสร้างเค้าโครง XML ของคุณ


ฉันต้องเอาส่วนที่แตกออกหรือไม่หรือจะต้องเอาชิ้นส่วนนั้นออกด้วยหรือไม่
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

3
@KarlMorrison คำถามนี้อายุเกือบ 4 ปีและไม่มีส่วนเกี่ยวข้องกับเศษเล็กเศษน้อย ฉันแนะนำให้ยื่นคำถามใหม่และ / หรือลองดูandroid.app.FragmentTransactionและเป็นreplace()วิธีการ
lupz

มันน่าเสียดายที่คำตอบของคุณซับซ้อนเกินไป - ในความคิดเห็น - สำหรับโปรแกรมเมอร์มือใหม่ Android :-(
Antonio Sesto

2
@ อันโตนิโอเซสโต้อะไรซับซ้อนเกินไป? คุณสับสนที่ไหน
AdamMc331

@broot ฉันต้องการเพิ่มภาพในแต่ละวันใน linearlayout ของฉันที่ฉันได้ทำไปแล้ว หลังจากนั้นฉันจะลบภาพบางส่วนออกจากเค้าโครง จากนั้นฉันต้องการเรียกคืนที่ตำแหน่งของตัวเองจากตำแหน่งที่ฉันลบไป หมายถึงฉันต้องการที่จะเพิ่มภาพโดยไม่ต้องลบพ่อแม่ของเด็กคุณช่วยกรุณา hlep ฉันได้อย่างไร
PriyankaChauhan

43

และถ้าคุณทำอย่างนั้นบ่อยครั้งคุณสามารถใช้ViewSwitcherหรือViewFlipperเพื่อลดความยุ่งยากในการดู


ใช่ถ้ามีคำถามเกี่ยวกับมุมมองทางเลือกดูฟลิปเปอร์ / ตัวสลับจะดีกว่าที่จะใช้
Zoombie

2
@Shail Adi คุณลองใส่รหัสการสอน ViewSwitcher หรือไม่?
Snicolas

ฉันรู้ว่ามันเก่า - แต่ข้อแม้คือ ViewSwitcher เริ่มต้นและเก็บ Views ทั้งสองไว้ในตัวเอง (FrameLayout)
Vikram Bodicherla

นี่ควรเป็นคำตอบที่แนะนำ ทำไมไม่ใช้เพียงโซลูชันที่ผ่านการทดสอบมาอย่างดี

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

มันทำงานในกรณีของฉัน oldSensor และ 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);
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.