【问题标题】:Android layout replacing a view with another view on run timeAndroid布局在运行时用另一个视图替换视图
【发布时间】:2011-03-21 00:40:53
【问题描述】:

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

【问题讨论】:

    标签: android xml android-layout view


    【解决方案1】:

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

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

    【讨论】:

    • 我必须删除片段,还是片段也会被删除?
    • @KarlMorrison 这个问题差不多4岁了,和fragment无关。我建议提出一个新问题和/或查看android.app.FragmentTransaction 它是replace() 方法。
    • 很遗憾你的答案太复杂了——在 cmets 中——对于新手 Android 程序员来说:-(
    • @AntonioSesto 什么太复杂了?你在哪里弄糊涂了?
    • @broot 我想将图像添加到我已经完成的线性布局中。后来我从布局中删除了一些图像。然后我想将它恢复到我删除的位置。表示我想在不删除孩子父母的情况下添加图片,你能帮帮我吗?
    【解决方案2】:

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

    【讨论】:

    • 是的,如果有备用视图的问题,最好使用视图翻转器/切换器
    • @Shail Adi,您是否尝试过获取 ViewSwitcher 教程代码?
    • 我知道这是旧的 - 但需要注意的是 ViewSwitcher 初始化并保存两个视图本身(一个 FrameLayout)。
    • 这应该是推荐的答案。为什么不直接使用现成的经过良好测试的解决方案。
    【解决方案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);
        }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值
    【解决方案4】:

    它适用于我的情况,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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多