在LinearLayout中强制执行ConstraintLayout的运行时约束

时间:2017-09-03 17:00:14

标签: android android-layout constraints android-linearlayout android-constraintlayout

我对运行时生成的UI有一些困难,这些UI不会受到约束。对于Android的其他答案和文档,我尝试了ConstraintSet以及其他一些方法。

我正在为自定义类扩展ConstraintLayout,该类在应用程序的功能中具有不可或缺的作用。我从Web服务器提取数据,然后创建这些对象并将它们添加到LinearLayoutLinearLayoutConstraintLayoutTextView都显示其正确的尺寸;但是,TextView彼此重叠并拒绝遵循任何约束。

我可以通过布局编辑器手动创建我想要做的事情的副本,并且它可以正常工作。

我当前的设置(this扩展了ConstraintLayout,text_nametext_pointsTextView 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);

constrainWidthconstrainHeight工作;当我摆脱它们或改变价值观时,它会产生影响。但是,任何connect业务都不会做任何事情。 TextView的文本大小合适,但不遵守任何约束。我错过了一些使.connect有效的行吗?

澄清:我有ScrollView - > LinearLayout - > ConstraintLayout - > TextView秒。在编辑器中创建时,约束可以正常工作。在运行时使用ConstraintLayoutConstraintSet实例化中创建时,连接的约束无效,但其他属性也有效。

Display in-app - TextViews overlap, not following constraints

编辑:只是为了确认,这里是添加到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

2 个答案:

答案 0 :(得分:0)

看到这个答案,我认为你错过了clone()指令。

Add view programatically in ConstraintLayout

答案 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_idview.getId()用于ConstraintSet

对于要添加到View的{​​{1}}的父级,您可以使用ConstraintLayout