我有一个名为main的xml-layout文件,其中包含两个文本视图A/B和一个视图C。我还有另外两个名为option1和option2的xml-layout文件。是否可以在运行时通过Java将option1或option2加载到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);
如果你不想替换已有的View,而是在初始化时选择选项1/选项2,那么你可以更轻松地做到这一点:为父布局设置android:id
,然后:
ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);
根据视图结构,您需要将“index”设置为正确的值。您还可以使用 ViewStub:将您的 C 视图添加为 ViewStub,然后:
ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();
这样,如果您想重新构建XML布局,就不必担心上面的“索引”值了。
如果您经常这样做,您可以使用 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和newSensor - 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);
}
android.app.FragmentTransaction
以及它的replace()
方法。 - lupz