android - 以编程方式将 View 添加到 ConstraintLayout

标签 android android-layout

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

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

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)
    }
}

运行此代码时,第一个 View 正确显示,但第二个 View 位于左上角(好像没有任何限制)。

我到底错过了什么?

最佳答案

您需要添加至少 一个水平一个垂直 约束才能在 ConstraintLayout 中添加 View ,

这里,初始化构造函数中不满足:

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

ConstraintLayout读取& ConstraintSet .

关于android - 以编程方式将 View 添加到 ConstraintLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957425/

相关文章:

android - 如何在 Android 中使用不同的参数为不同的语言格式化字符串?

android - Flutter-SchedulerBinding,showDialoag,AlertDialog和WillPopScope的问题组合

android - ADT 不允许创建 Android Activity

java - 横向和纵向方向android的不同设计

android - 为全屏 Activity 摆脱不必要的根布局

Android - 没有滚动条的滚动

android - setLayoutParams 倾角值

android - @Inject 设置不注入(inject)属性

Android:如何取消有 Intent 的位置更新请求?

android - 为什么我的 ScrollView 只有在不需要滚动的时候才会太宽?