代码之家  ›  专栏  ›  技术社区  ›  Christian

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

  •  158
  • Christian  · 技术社区  · 14 年前

    我有一个 xml xml格式 -布局文件 option1 option2 . 选项1 选项2 在运行时通过Java转换成C?如果是,我必须使用什么功能?

    3 回复  |  直到 4 年前
        1
  •  380
  •   ישו אוהב אותך Mahavir    8 年前

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

    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之间进行选择,这样做就更容易了:set android:id

    ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
    View C = getLayoutInflater().inflate(optionId, parent, false);
    parent.addView(C, index);
    

    您必须根据视图结构将“索引”设置为适当的值。你也可以用

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

    这样,如果您想重新构造XML布局,就不必担心上面的“索引”值。

        2
  •  43
  •   cherdt    10 年前

    如果你经常这样做,你可以用 ViewSwitcher 或者 ViewFlipper 以简化视图替换。

        3
  •  3
  •   Kaiwalya Rangle    5 年前
    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);
        }
    
        4
  •  0
  •   ch13mob    6 年前

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