0

我对运行时生成的UI没有遵循约束有些困难。根据Android的其他答案和文档,我尝试了ConstraintSet以及其他一些方法。对LinearLayout中的ConstraintLayout执行运行时约束

我正在扩展ConstraintLayout,以获得在应用程序功能中具有组成部分的自定义类。我从Web服务器获取数据,然后创建这些对象并将它们添加到LinearLayoutLinearLayout,ConstraintLayoutTextView都显示其正确的大小;然而,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工作的线?

澄清:我有ScrollViewLinearLayoutConstraintLayoutTextView s。在编辑器中创建时,约束可以正常工作。在运行时使用ConstraintSetConstraintLayout的实例化中创建时,连接的约束不起作用,但其他属性可以。

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 

回答

0

的问题是,编程,视图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

对于要添加到ConstraintLayoutView的父级,您可以使用ConstraintSet.PARENT_ID

0

看到这个答案,我认为你缺少的clone()指令。

Add view programatically in ConstraintLayout

+0

没有这个运气。是否有可能在第一次渲染后才能完成? –

+0

我假设的这些方法用于onCreate Activity方法或onCreateView Fragment方法。我从来没有尝试过它作为视图的一部分。如果您发布布局,我可能会提供更多信息。我认为你尝试的方式更复杂。 – Juan

+0

我正在从给定设备当前位置的Web服务器流式传输数据。之前已经完成动态加载数据!布局如前所述 - ScrollView - > LinearLayout - ConstraintLayout - TextView。加载数据时创建ConstraintLayout和TextViews。扩展ConstraintLayout自定义构造函数以传递数据。上面的代码片段来自扩展类的构造函数。 –