动态设置ConstraintLayout的约束

动态设置ConstraintLayout约束

以前一直是在布局里直接设置ConstraintLayout的约束,前几天遇到了一个有点特殊的需求,需要动态设置布局,xml布局使用的ConstraintLayout,所以就立马恶补动态设置ConstraintLayout约束的知识,总结如下。

  1. 获取要设置目标控件的父布局。
val constraintLayoutRoot = getView<ConstraintLayout>(R.id.constraint_dynamics_root)
  1. 实例化一个ConstraintSet(),此类是用来动态设置约束的合集。
val constraintSet = ConstraintSet()
  1. 将布局中的约束克隆出来,赋值给第二步实例化的constraintSet对象。
    常用的有三种克隆方法,这里我们使用第一种克隆方法。
set.clone(constraintLayout: ConstraintLayout)  //克隆第一步获取到的constraintLayout
set.clone(set: ConstraintSet)   //克隆其他的constraintSet()
set.clone(context: Context, constraintLayoutId: Int)    //直接克隆父布局id。
  1. 动态修改约束。
    常用方法有以下两种,由参数上可见,第二个方法多了一个添加间距的参数,所以使用时,可以根据情况调用不同方法。
ublic void connect(int startID, int startSide, int endID, int endSide) {}
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)
  1. 应用约束。
    调用applyTo()方法即可应用约束。
constraintSet.applyTo(constraintLayoutRoot)
  1. 注意
    1、 克隆出来的constraintSet()只是一个克隆体,对其进行的各种约束操作,最后都要applyTo()才能生效,如果想要清空之前的约束,可以使用
constraintSet.clear(viewId)

2、当使用ConstraintSet的时候,约束布局里的所有view都必须要有id,不然会报错。


版权声明:本文为qq_42061290原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。