我遇到了一个问题,即如何以编程方式向ConstraintLayout
添加视图,并设置布局工作所需的所有约束。
我现在的办法行不通:
ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.mainConstraint);
ConstraintSet set = new ConstraintSet();
set.clone(layout);
ImageView view = new ImageView(this);
layout.addView(view,0);
set.connect(view.getId(), ConstraintSet.TOP, layout.getId(), ConstraintSet.TOP, 60);
set.applyTo(layout);
ImageView
甚至没有出现在布局中,当添加到RelativeLayout
中时,它就像一个魅力。
如何创建所需的约束,以便布局再次工作?
3条答案
按热度按时间jvlzgdj91#
我认为您应该在添加ImageView后克隆布局。
but5z9lq2#
正在将此How do I add elements dynamically to a view created with XML与https://stackoverflow.com/a/40527407/4991437合并
我发现了一个“更简单”的解决方案。这对于添加使用Viewbinding和ViewModel的多个一致视图效果最好
1.创建 fragment_home.xml
1.将线性布局添加到 fragment_home.xml 的底部
1.创建一个要扩展的 dynamic_view.xml
1.从ViewModel/Array或任何可用的数据源获取元素
1.充气并添加元素
在本例中,我使用recyclerview创建了一个textview(title)[有一些库可以实现这个功能,但是我发现有更多的控件可以实现这个功能]
步骤1、2
第三步
步骤4、5
fnvucqvd3#
运动布局解决方案
MotionLayout比较复杂,因为它有多个约束集,需要特殊处理。如果使用针对ConstraintLayout的解决方案,由于某种原因,它会将视图定位在右下角的某个位置。在MotionLayout中添加视图的正确方法是使用
updateState
而不是applyTo
:为了使您的视图在其他定义的约束集中可见(在本例中为
end
约束集,又名R.id.end
),请使用专用的cloneConstraintSet
方法并设置视图的大小: