时间:2010-07-26 10:40:29

标签: android android-layout

4 个答案:

答案 0 :(得分:353)

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

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

您必须根据视图结构将“index”设置为正确的值。您还可以使用 ViewStub :将您的C视图添加为ViewStub,然后:

ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();

如果您想要重构XML布局,那么您不必担心上面的“索引”值。

答案 1 :(得分:41)

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

答案 2 :(得分: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);
        }

答案 3 :(得分:0)

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