添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
·  阅读

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

获取要设置目标控件的父布局。

val constraintLayoutRoot = getView<ConstraintLayout>(R.id.constraint_dynamics_root) 

实例化一个ConstraintSet(),此类是用来动态设置约束的合集。

val constraintSet = ConstraintSet()

将布局中的约束克隆出来,赋值给第二步实例化的constraintSet对象,常用的有三种克隆方法,这里我们使用第一种克隆方法。

1set.clone(constraintLayout: ConstraintLayout)  //克隆第一步获取到的constraintLayout
2set.clone(set: ConstraintSet)   //克隆其他的constraintSet()
3set.clone(context: Context, constraintLayoutId: Int)    //直接克隆父布局id。

动态修改约束。常用方法有以下两种,由参数上可见,第二个方法多了一个添加间距的参数,所以使用时,可以根据情况调用不同方法。

1public void connect(int startID, int startSide, int endID, int endSide) {}
2public 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,不然会报错。

分类:
Android
标签: