【发布时间】:2011-03-21 00:40:53
【问题描述】:
我有一个 xml-layout 文件 main 有两个文本视图 A/B 和一个视图 C。
我还有另外两个xml-layout 文件option1 和option2。
是否可以在运行时通过 Java 将 option1 或 option2 加载到 C 中?如果是这样,我必须使用什么功能?
【问题讨论】:
标签: android xml android-layout view
我有一个 xml-layout 文件 main 有两个文本视图 A/B 和一个视图 C。
我还有另外两个xml-layout 文件option1 和option2。
是否可以在运行时通过 Java 将 option1 或 option2 加载到 C 中?如果是这样,我必须使用什么功能?
【问题讨论】:
标签: android xml android-layout view
您可以随时替换任何视图。
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 布局,您就不必担心高于“索引”值。
【讨论】:
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);
}
【讨论】: