Android 布局在运行时用另一个视图替换一个视图

我有一个 xml-布局文件主要与两个文本视图 A/B 和一个视图 C。 我有另外两个 xml-布局文件 option1option2。 是否可以在运行时通过 Java 将 option1option2加载到 C 中?如果是,我必须使用什么函数?

128942 次浏览

您可以随时替换任何视图。

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);

如果您不想替换已经存在的 观景,而是在初始化时选择 option1/option2,那么您可以更容易地做到这一点: 为父布局设置 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 布局,就不必担心以上的“ index”值。

如果您经常这样做,您可以使用 视频切换器ViewFlipper来简化视图替换。

它在我的案例中起作用,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);
}
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);
}