185

我有一个xml带有两个文本视图 A/B 和一个视图 C 的 -layout 文件 main。我还有两个其他xml-layout 文件option1option2. 是否可以通过 Java 将其中一个option1option2在运行时加载到 C 中?如果是这样,我必须使用什么功能?

4

4 回答 4

382

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

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,而是在初始化时在 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 布局,您就不必担心高于“索引”值。

于 2010-09-21T11:55:25.260 回答
44

如果你经常这样做,你可以使用ViewSwitcherViewFlipper来简化视图替换。

于 2011-05-05T08:40:09.550 回答
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);
    }
于 2019-06-27T14:58:09.857 回答
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);
        }
于 2018-04-06T14:42:27.983 回答