繁体   English   中英

使用for循环以编程方式将元素添加到FrameLayout

[英]Adding elements programmatically to FrameLayout using a for loop

为什么当我将元素添加到FrameLayout flCatScroll中时,仅显示一个而不显示十个,它们可能是重叠的,或者为什么不增加边距?

    myactivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //Main Framelayout
            FrameLayout flCatScroll = (FrameLayout) myactivity.findViewById(R.id.flCatScroll);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
            params.gravity = Gravity.TOP;
            params.topMargin = 20;

            for(int i = 0;  i < 10; i++) {
                //FrameLayout mainItemLayout = new FrameLayout(myactivity);
                listFramelayouts.add(new FrameLayout(myactivity));
            }
            for(int i = 0;  i < listFramelayouts.size(); i++) {
                params.topMargin = 20 * i;
                TextView itemName = new TextView(myactivity);
                itemName.setText("Test" + i);
                listFramelayouts.get(i).addView(itemName);
                flCatScroll.addView(listFramelayouts.get(i), params);
            }

        }
    });

引用语义再次出现!

因为您正在重用params对象,而不是每次都创建一个新对象,所以无论添加视图时边距是多少,它们最后都共享相同的边距。 因此,它们确实是重叠的。

这有意义吗?

dcow是正确的。 您正在为每个新的TextView重用相同的LayoutParams对象。 因此,最后所有这些都具有相同的topMargin。 您需要为每个新视图创建参数。 您可以添加新功能,例如:

    private FrameLayout.LayoutParams getLayoutParamsFor(final int i) {
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
        params.gravity = Gravity.TOP;
        params.topMargin = 20 * i;
        return params;
    }

然后在循环中,在addView(...)调用中调用它:

    flCatScroll.addView(listFramelayouts.get(i), getLayoutParamsFor(i));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM