MATCH_CONSTRAINTS 不适用于动态生成的加权链
MATCH_CONSTRAINTS not working in dynamically generated weighted chain
我写了下面的方法。它动态创建 16 个红色视图框,然后将它们添加到约束布局链中,以便在父布局中水平分布它们。它有效,但前提是我给视图一个特定的宽度值,并且我希望它们填充可用的 space。如果我将每个视图的宽度设置为 ConstraintSet.MATCH_CONSTRAINT
,其中 none 个会出现。
我做错了什么?我认为如果将宽度设置为 MATCH_CONSTRAINT
,每个视图将填满按其权重值分配给它的 space。相反,它们根本没有出现,只有在我给它们指定宽度时它们才会出现,但它们不会增大或缩小以适应视图。就好像将它们设置为 MATCH_CONSTRAINT
与将宽度字面上设置为零一样。
private fun createDropTargets(parentView: ConstraintLayout) {
parentView.setOnDragListener(StaffDragListener())
val set = ConstraintSet()
val ids = arrayListOf<Int>()
val weights = arrayListOf<Float>()
for (i in 0..15) {
val drop = View(activity)
drop.setBackgroundColor(Color.RED)
// THE NEXT LINE IS WHERE I SET THE WIDTH VALUE. IF I SET TO A NUMBER > 0 THE VIEWS SHOW UP, BUT DO NOT DYNAMICALLY FILL THE SPACE
val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 0)
params.setMargins(5, 0, 5, 0)
drop.layoutParams = params
drop.id = View.generateViewId()
parentView.addView(drop)
ids.add(drop.id)
weights.add(1f)
}
set.clone(parentView)
var previousId: Int? = null
for ((index, id) in ids.withIndex()) {
if (previousId == null) {
set.connect(id, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
} else {
set.connect(id, ConstraintSet.LEFT, previousId, ConstraintSet.RIGHT)
if (index == ids.size - 1) {
set.connect(id, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT)
}
}
previousId = id
}
set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
set.applyTo(parentView)
}
MATCH_CONSTRAINT
将 width/height 设置为零,因为它在 ConstraintSet:
中定义如下
public static final int MATCH_CONSTRAINT = 0;
这意味着约束将定义大小。没有约束或不正确的约束只会导致零 width/height.
除了高度设置为 MATCH_CONSTRAINT
(记住 0 == MATCH_CONSTRAINT
)之外,您的代码是正确的,但是您没有对高度应用约束,因此视图消失了(宽度但没有高度。)如果您为视图提供设置的高度,它们将会出现。以下代码将显示高度为 100px 的视图:
private fun createDropTargets(parentView: ConstraintLayout) {
parentView.setOnDragListener(StaffDragListener())
val set = ConstraintSet()
val ids = arrayListOf<Int>()
val weights = arrayListOf<Float>()
for (i in 0..15) {
val drop = View(activity)
drop.setBackgroundColor(Color.RED)
val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 100)
params.setMargins(5, 0, 5, 0)
drop.layoutParams = params
drop.id = View.generateViewId()
parentView.addView(drop)
ids.add(drop.id)
weights.add(1f)
}
set.clone(parentView)
set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
set.applyTo(parentView)
}
顺便说一句,第二个循环是多余的。所有这些工作都是通过创建链来完成的。
您必须决定是要定义高度,还是让高度由应用在 垂直 方向的适当约束来设置。
我写了下面的方法。它动态创建 16 个红色视图框,然后将它们添加到约束布局链中,以便在父布局中水平分布它们。它有效,但前提是我给视图一个特定的宽度值,并且我希望它们填充可用的 space。如果我将每个视图的宽度设置为 ConstraintSet.MATCH_CONSTRAINT
,其中 none 个会出现。
我做错了什么?我认为如果将宽度设置为 MATCH_CONSTRAINT
,每个视图将填满按其权重值分配给它的 space。相反,它们根本没有出现,只有在我给它们指定宽度时它们才会出现,但它们不会增大或缩小以适应视图。就好像将它们设置为 MATCH_CONSTRAINT
与将宽度字面上设置为零一样。
private fun createDropTargets(parentView: ConstraintLayout) {
parentView.setOnDragListener(StaffDragListener())
val set = ConstraintSet()
val ids = arrayListOf<Int>()
val weights = arrayListOf<Float>()
for (i in 0..15) {
val drop = View(activity)
drop.setBackgroundColor(Color.RED)
// THE NEXT LINE IS WHERE I SET THE WIDTH VALUE. IF I SET TO A NUMBER > 0 THE VIEWS SHOW UP, BUT DO NOT DYNAMICALLY FILL THE SPACE
val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 0)
params.setMargins(5, 0, 5, 0)
drop.layoutParams = params
drop.id = View.generateViewId()
parentView.addView(drop)
ids.add(drop.id)
weights.add(1f)
}
set.clone(parentView)
var previousId: Int? = null
for ((index, id) in ids.withIndex()) {
if (previousId == null) {
set.connect(id, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT)
} else {
set.connect(id, ConstraintSet.LEFT, previousId, ConstraintSet.RIGHT)
if (index == ids.size - 1) {
set.connect(id, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT)
}
}
previousId = id
}
set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
set.applyTo(parentView)
}
MATCH_CONSTRAINT
将 width/height 设置为零,因为它在 ConstraintSet:
public static final int MATCH_CONSTRAINT = 0;
这意味着约束将定义大小。没有约束或不正确的约束只会导致零 width/height.
除了高度设置为 MATCH_CONSTRAINT
(记住 0 == MATCH_CONSTRAINT
)之外,您的代码是正确的,但是您没有对高度应用约束,因此视图消失了(宽度但没有高度。)如果您为视图提供设置的高度,它们将会出现。以下代码将显示高度为 100px 的视图:
private fun createDropTargets(parentView: ConstraintLayout) {
parentView.setOnDragListener(StaffDragListener())
val set = ConstraintSet()
val ids = arrayListOf<Int>()
val weights = arrayListOf<Float>()
for (i in 0..15) {
val drop = View(activity)
drop.setBackgroundColor(Color.RED)
val params = ConstraintLayout.LayoutParams(ConstraintSet.MATCH_CONSTRAINT, 100)
params.setMargins(5, 0, 5, 0)
drop.layoutParams = params
drop.id = View.generateViewId()
parentView.addView(drop)
ids.add(drop.id)
weights.add(1f)
}
set.clone(parentView)
set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, ids.toIntArray(), weights.toFloatArray(), ConstraintSet.CHAIN_SPREAD_INSIDE)
set.applyTo(parentView)
}
顺便说一句,第二个循环是多余的。所有这些工作都是通过创建链来完成的。
您必须决定是要定义高度,还是让高度由应用在 垂直 方向的适当约束来设置。