【问题标题】:Add a ViewStub programmatically to an RelativeLayout, than add a second ViewStub below the first以编程方式将 ViewStub 添加到 RelativeLayout,而不是在第一个 ViewStub 下方添加第二个 ViewStub
【发布时间】:2016-12-18 04:17:36
【问题描述】:

嘿,我将在下面的代码中简要描述我所做的事情: 我创建了一个 ViewStub (Vs) 并将其添加到 RelativeLayout (Rl)。 然后我想在同一个 RL 中添加一个新的 Vs,所以我创建了 stub2 并将其添加到 rl。 然后我参考第一个和第二个 Vs (rlInf1 , rlInf2) 的 Rl (它是 inflatet) 然后我设置 Rl.Layoutparams 使 rlInf2 应该低于 rlInf1 但它们是重叠的。 如何设置 LayoutParams 以使新的 ViewStub 低于旧的? 有什么想法吗?

(我没有在 XML 中添加 ViewStub,而是在 Java-Code 中)

//Löschen des Standard-Tv
            TextView tv = (TextView) findViewById(R.id.tvNoContentInfo);
            RelativeLayout rl = (RelativeLayout) findViewById(R.id.Layout_ContentInfo);
            rl.removeView(tv);
            //Erstellen eines ViewStubs
            ViewStub stub1 = new ViewStub(this);
            //zum richtigen Layout hinzufügen
            rl.addView(stub1);
            stub1.setLayoutResource(R.layout.routen_navi_infocontent);
            //Referenz zum eingefügten Layout herstellen
            View inflated = stub1.inflate();
            //Zugriff auf Inhalt des zufor referenzierten Layouts
            TextView myTextView = (TextView) inflated.findViewById(R.id.tvHeaderInfocontent);
            myTextView.setText("hey");
            stub1.setId(View.generateViewId());
            stub1.setInflatedId(stub1.getId());
            RelativeLayout rlInf1 = (RelativeLayout) inflated.findViewById(R.id.Layout_infocontent);

            ViewStub stub2 = new ViewStub(this);
            //zum richtigen Layout hinzufügen
            rl.addView(stub2);
            stub2.setLayoutResource(R.layout.routen_navi_infocontent);
            //Referenz zum eingefügten Layout herstellen
            View inflated2 = stub2.inflate();
            RelativeLayout rlInf2 = (RelativeLayout) inflated2.findViewById(R.id.Layout_infocontent);
            RelativeLayout.LayoutParams p= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            p.addRule(RelativeLayout.BELOW,rlInf1.getId());
            rlInf2.setLayoutParams(p);

【问题讨论】:

  • 如果你马上给它们充气,你需要这些ViewStubs 做什么?
  • 我只是测试它...我想要一个动态的一面->也许我第一次需要 2Vs,第二次我需要它 3 次...在我开始使用之前真正的程序我想测试我是否可以将 Vs 定位在另一个 @pskink 下方
  • 顺便说一句 LinearLayouts 还不够好?或者为什么不改用RecyclerView
  • 什么是 RecyclerView?也许还有另一种可能性来做我想做的事......我有一个 Rl,我必须在运行时“包含”它,有时我必须在前一个 Rl 的下方两次或多次包含相同的 Rl
  • 所以先了解ListView,然后再了解RecyclerView

标签: android android-relativelayout layoutparams viewstub


【解决方案1】:

一旦你将视图膨胀到ViewStubViewStub 就消失了,所以改变它的 id 是没有用的。您需要在膨胀视图上更改它。 所以改变

stub1.setId(View.generateViewId());

inflated.setId(View.generateViewId());

并将最后两行更改为:

    p.addRule(RelativeLayout.BELOW,inflated.getId());
    inflated2.setLayoutParams(p);

此外,您可能希望从 inflated 视图中获取现有的 LayoutParams,而不是创建新的,否则您最终会覆盖所有现有的。

顺便说一句:我必须假设添加ViewStubs 和即时通胀只是对某些东西的测试,而不是真正的流量,对吧? :-)

补充: 是的,您可以在不使用 ViewStub 的情况下添加布局

    View inflated = LayoutInflater.from(this).inflate(R.layout.routen_navi_infocontent, rl, false);
    inflated.setId(View.generateViewId());
    rl.addView(inflated);

    View inflated2 = LayoutInflater.from(this).inflate(R.layout.routen_navi_infocontent, rl, false);
    RelativeLayout.LayoutParams p= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    p.addRule(RelativeLayout.BELOW,inflated.getId());
    inflated2.setLayoutParams(p);
    rl.addView(inflated2);

    TextView myTextView = (TextView) inflated.findViewById(R.id.tvHeaderInfocontent);
    myTextView.setText("hey");

【讨论】:

  • 谢谢,我找到了另一个方法(使用列表),但我的问题是列表只显示第一项而不是第二项......所以如果我不能这样做用列表我会测试你的代码
  • 哦,这只是一个失败:D 它显示了两个元素,但我必须滚动...我认为如果列表太长,相对布局会扩展...@NT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多