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


175

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

Answers:


372

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

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布局,则不必担心高于“索引”值。


我必须删除片段,还是也要删除片段?
K-SO的毒性在增加。

3
@KarlMorrison这个问题将近4年了,与片段无关。我建议提出一个新问题和/或看看android.app.FragmentTransaction它的replace()方法。
lupz 2014年

遗憾的是,对于新手Android程序员,您的答案过于复杂-在注释中:-(
Antonio Sesto

2
@AntonioSesto有什么太复杂了?您在哪里感到困惑?
2015年

@broot我想每天将图像添加到我完成的linearlayout中。后来我从布局中删除了一些图像。那么我想将其恢复到自己删除后的位置。表示我想添加图像而不移除孩子的父母,可以请你帮我吗?
PriyankaChauhan

43

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


是的,如果有其他视图问题,则最好使用视图切换器/切换器
Zoombie 2011年

2
@Shail Adi,您是否尝试过使用ViewSwitcher教程代码?
Snicolas 2012年

我知道这很旧-但要注意的是,ViewSwitcher会初始化并保存两个View本身(一个FrameLayout)。
Vikram Bodicherla

这应该是推荐的答案。为什么不只是使用现成的,经过测试的解决方案呢?

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

6
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将改善答案的长期价值
frobinsonj

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);
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.