【问题标题】:How to center children in custom constraint layout programmatically如何以编程方式在自定义约束布局中居中儿童
【发布时间】:2021-07-10 16:35:43
【问题描述】:

已经有一段时间了。基本上我希望自定义 ConstraintLayout 中的视图以编程方式居中。

我的布局是这样的:

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

    private val constraintSet = ConstraintSet()


    override fun onFinishInflate() {
        super.onFinishInflate()

        for (i in 0 until childCount) {
            val child = getChildAt(i)
            setConstraints(child)
        }
        constraintSet.applyTo(this)
    }

    private fun setConstraints(view:View){
        constraintSet.clone(this)
        constraintSet.centerHorizontally(view.id,ConstraintSet.PARENT_ID)
        constraintSet.centerVertically(view.id,ConstraintSet.PARENT_ID)
    }
}

基本上我会遍历孩子并应用一些约束,但它似乎不起作用。视图仍固定在左上角。

有什么想法吗?

【问题讨论】:

    标签: android kotlin android-layout view


    【解决方案1】:

    尝试访问子视图的布局参数:

    class Test(context: Context) : ConstraintLayout(context, null, 0) {
        private fun setConstraints(child: View) {
            val params = child.layoutParams as ConstraintLayout.LayoutParams
            params.startToStart = ConstraintLayout.LayoutParams.PARENT_ID
            params.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID
            child.layoutParams = params
        }
        
        override fun addView(child: View?) {
            super.addView(child)
            child?.let { setConstraints(it) }
        }
    }
    

    还要注意我如何覆盖 addView 方法以将子视图添加到布局中。

    忽略我的构造函数,只重视方法。

    注意:我没有测试过这段代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2015-10-17
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多