以编程方式将视图添加到ConstraintLayout

3

我知道这个问题已经被问过很多次了,但是通过代码实现似乎很困难。

我想要实现的是扩展ConstraintLayout并添加两个视图。我有以下代码:

class TestLayout @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private val ids = mutableListOf<Int>()

    init {
        addTextView()
        addTextView()

        val set = ConstraintSet()
        set.clone(this)

        set.connect(ids[0], ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 200)
        set.connect(ids[1], ConstraintSet.TOP, ids[0], ConstraintSet.BOTTOM)

        set.applyTo(this)
    }

    private fun addTextView() {
        val view = TextView(context)

        addView(view, LayoutParams(LayoutParams.MATCH_CONSTRAINT, LayoutParams.WRAP_CONTENT))

        view.id = View.generateViewId()
        view.text = view.id.toString()

        ids.add(view.id)
    }
}

当运行此代码时,第一个视图正常显示,但第二个视图位于左上角(就像没有对其进行约束一样)。
我在这里缺少什么?
1个回答

3

您需要至少添加一个水平和一个垂直约束条件才能在ConstraintLayout中进行添加视图操作。

在这里,它在初始化构造函数中无法满足:

set.connect(ids[0], ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 200) // no vertical constraint (Top/Bottom), so view will add at 0 position of y axis
set.connect(ids[1], ConstraintSet.TOP, ids[0], ConstraintSet.BOTTOM) // No horizontal constraint so that view 2 will jump to position (0,0)

像这样做:

// Add constraints for View 1
set.connect(ids[0], ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 200)
set.connect(ids[0], ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 20) // Add top constraint to your view 1
set.connect(ids[0], ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 200) // Optional if you want symmetry of view 1 in layout

// Add constraints for view 2
set.connect(ids[1], ConstraintSet.TOP, ids[0], ConstraintSet.BOTTOM)
set.connect(ids[1], ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 200) // Add start constraint to view 2
set.connect(ids[1], ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 200) // Optional if you want symmetry of view 2 in layout

ConstraintLayoutConstraintSet中阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接