ฉันมีxml
ไฟล์ -layout หลักสอง textviews A / B และมุมมองที่ C. ฉันมีสองอื่น ๆxml
ไฟล์ -layout และoption1
option2
มันเป็นไปได้ที่จะโหลดอย่างใดอย่างหนึ่งoption1
หรือoption2
ในเวลาทำงานผ่าน Java เป็น C? ถ้าเป็นเช่นนั้นฉันต้องใช้ฟังก์ชั่นอะไร?
ฉันมีxml
ไฟล์ -layout หลักสอง textviews A / B และมุมมองที่ C. ฉันมีสองอื่น ๆxml
ไฟล์ -layout และoption1
option2
มันเป็นไปได้ที่จะโหลดอย่างใดอย่างหนึ่งoption1
หรือoption2
ในเวลาทำงานผ่าน Java เป็น C? ถ้าเป็นเช่นนั้นฉันต้องใช้ฟังก์ชั่นอะไร?
คำตอบ:
คุณสามารถแทนที่มุมมองใด ๆ ได้ตลอดเวลา
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 ของคุณ
android.app.FragmentTransaction
และเป็นreplace()
วิธีการ
และถ้าคุณทำอย่างนั้นบ่อยครั้งคุณสามารถใช้ViewSwitcherหรือViewFlipperเพื่อลดความยุ่งยากในการดู
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);
}
มันทำงานในกรณีของฉัน 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);
}