Kotlin中设置ConstraintLayout底部边距无效,如何通过代码处理?
问题原因
你直接新建了ConstraintLayout.LayoutParams对象,把原来的app:layout_constraintBottom_toTopOf="@+id/keyboard"约束给覆盖丢失了,而且在ConstraintLayout的约束关系生效时,普通的bottomMargin必须配合对应的约束才能起作用,不是单纯修改LayoutParams就行。
两种可行解决方法
方法1:保留原有约束,直接修改边距
不要新建LayoutParams,直接获取当前View的现有参数修改,这样不会丢失原有的约束:val params = b.timerscreen.layoutParams as ConstraintLayout.LayoutParams params.bottomMargin = 300 // 这里是像素值,要转dp的话看下面的转换方法 b.timerscreen.requestLayout() // 触发重新布局方法2:重新配置完整约束
如果你确实需要重置约束,得把顶部和底部的约束都重新设置好,再配置边距:val params = ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_CONSTRAINT ).apply { topToTop = ConstraintLayout.LayoutParams.PARENT_ID // 对应xml里的top_toTopOf="parent" bottomToTop = R.id.keyboard // 对应xml里的bottom_toTopOf="@+id/keyboard" bottomMargin = 300 } b.timerscreen.layoutParams = params
额外提示:dp转px
上面的300是像素单位,要是你想按dp设置,得先转换成像素:
fun dpToPx(dp: Int, context: Context): Int { return (dp * context.resources.displayMetrics.density).toInt() } // 调用示例: params.bottomMargin = dpToPx(300, b.timerscreen.context)
内容的提问来源于stack exchange,提问作者TenolToSy
相关产品推荐
相关产品推荐

