我对运行时生成的UI有一些困难,这些UI不会受到约束。对于Android的其他答案和文档,我尝试了ConstraintSet
以及其他一些方法。
我正在为自定义类扩展ConstraintLayout
,该类在应用程序的功能中具有不可或缺的作用。我从Web服务器提取数据,然后创建这些对象并将它们添加到LinearLayout
。 LinearLayout
,ConstraintLayout
和TextView
都显示其正确的尺寸;但是,TextView
彼此重叠并拒绝遵循任何约束。
我可以通过布局编辑器手动创建我想要做的事情的副本,并且它可以正常工作。
我当前的设置(this
扩展了ConstraintLayout,text_name
和text_points
是TextView
s):
this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
this.addView(text_name);
this.addView(text_points);
ConstraintSet constraints = new ConstraintSet();
constraints.clone(this);
constraints.constrainHeight(text_points.getId(), WRAP_CONTENT);
constraints.constrainWidth(text_points.getId(), WRAP_CONTENT);
constraints.constrainHeight(text_name.getId(), WRAP_CONTENT);
constraints.constrainWidth(text_name.getId(), WRAP_CONTENT);
constraints.connect(text_name.getId(), LEFT, getId(), LEFT);
constraints.connect(text_points.getId(), RIGHT, getId(), RIGHT);
constraints.applyTo(this);
constrainWidth
和constrainHeight
工作;当我摆脱它们或改变价值观时,它会产生影响。但是,任何connect
业务都不会做任何事情。 TextView
的文本大小合适,但不遵守任何约束。我错过了一些使.connect
有效的行吗?
澄清:我有ScrollView
- > LinearLayout
- > ConstraintLayout
- > TextView
秒。在编辑器中创建时,约束可以正常工作。在运行时使用ConstraintLayout
在ConstraintSet
实例化中创建时,连接的约束无效,但其他属性也有效。
编辑:只是为了确认,这里是添加到LinearLayout(LOCS)的行数的输出,LinearLayout(LDIM)的大小,ConstraintLayout(LOCDIM)的大小以及TextViews的大小(TVDIM,TV2DIM):
09-03 14:19:18.664 D/LOCS: 2
09-03 14:19:18.665 D/LDIM: 1080 w
09-03 14:19:18.665 D/LDIM: 58 h
09-03 14:19:18.665 D/LOCDIM: 1080 w
09-03 14:19:18.666 D/LOCDIM: 29 h
09-03 14:19:18.667 D/TVDIM: 165 w
09-03 14:19:18.667 D/TVDIM: 29 h
09-03 14:19:18.668 D/TV2DIM: 29 w
09-03 14:19:18.668 D/TV2DIM: 29 h
答案 0 :(得分:0)
看到这个答案,我认为你错过了clone()
指令。
答案 1 :(得分:0)
问题在于,以编程方式,未正确分配View ID。我在尝试不同的边距,宽度,高度,比例和旋转组合时发现了这一点 - 两个视图都应用了相同的更改。
解决方案是通过以某种方式生成ID来自己设置ID。但是,定位低API版本(< 17),View.generateViewId()
是不允许的;因此,你必须使用其中一个不幸的丑陋块围绕它:
int view_id;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
view_id = View.generateViewId();
} else {
view_id = new Random(System.currentTimeMillis()).nextInt();
}
view.setId(view_id);
从那时起,您可以将view_id
或view.getId()
用于ConstraintSet
。
对于要添加到View
的{{1}}的父级,您可以使用ConstraintLayout
。