以前一直是在布局里直接设置ConstraintLayout的约束,前几天遇到了一个有点特殊的需求,需要动态设置布局,xml布局使用的ConstraintLayout,所以就立马恶补动态设置ConstraintLayout约束的知识,使用总结如下。
获取要设置目标控件的父布局。
val constraintLayoutRoot = getView<ConstraintLayout>(R.id.constraint_dynamics_root)
实例化一个ConstraintSet(),此类是用来动态设置约束的合集。
val constraintSet = ConstraintSet()
将布局中的约束克隆出来,赋值给第二步实例化的constraintSet对象,常用的有三种克隆方法,这里我们使用第一种克隆方法。
1、set.clone(constraintLayout: ConstraintLayout) //克隆第一步获取到的constraintLayout
2、set.clone(set: ConstraintSet) //克隆其他的constraintSet()
3、set.clone(context: Context, constraintLayoutId: Int) //直接克隆父布局id。
动态修改约束。常用方法有以下两种,由参数上可见,第二个方法多了一个添加间距的参数,所以使用时,可以根据情况调用不同方法。
1、public void connect(int startID, int startSide, int endID, int endSide) {}
2、public void connect(int startID, int startSide, int endID, int endSide, int margin) {}
startID:要约束的目标控件id。
startSide:要约束的目标控件的边界。
endID:约束条件控件的id。
endSide:endID的边界。
int margin:间距。
比如将view_divider的左边约束于tv_company_name的左边,就可以写成
constraintSet.connect(R.id.view_divider, ConstraintSet.LEFT, R.id.tv_company_name, ConstraintSet.LEFT)
如果要相对父布局设置约束,可以写成
constraintSet.connect(R.id.view_divider, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
要设置间距,添加一个margin参数即可
constraintSet.connect(R.id.view_divider, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 20)
其他方向的约束同理。
constraintSet()还可以方便的设置控件的宽高:
constraintSet.applyTo(constraintLayoutRoot)
应用约束。
调用applyTo()方法即可应用约束。
constraintSet.applyTo(constraintLayoutRoot)
克隆出来的constraintSet()只是一个克隆体,对其进行的各种约束操作,最后都要applyTo()才能生效,如果想要清空之前的约束,可以使用
constraintSet.clear(viewId)
当使用ConstraintSet的时候,约束布局里的所有view都必须要有id,不然会报错。