在我的例程(generateView())中,我正在创建一组以约束布局(reglette)排列的文本视图(实际上是字母图块)。为了创建文本视图,我使用表达式“val childView = TextView(requireActivity())”,然后调整视图的不同参数。在片段的其他地方,我在这些创建的视图上设置了 onTouchListeners。这一切都很好。
问题是当我第二次调用例程时,我想删除第一组视图以用新视图替换它们。我尝试使用“set.clear(view.id)”,但视图保留在屏幕上,新设置会覆盖它们。
我做错了什么?这是例程的代码:
private fun generateView(tirage:CharArray) {
val set = ConstraintSet()
val parentLayout = binding.reglette
var i = 0
set.clone(parentLayout)
for (v in parentLayout.children)
set.clear(v.id)
set.applyTo(parentLayout)
listLettre.clear()
val dummyLeft = TextView(requireActivity())
listLettre.add(dummyLeft)
listPos.add(i)
listIndex.add(i++)
for (lettre in tirage) {
val childView = TextView(requireActivity())
childView.id = View.generateViewId()
childView.width = LARGEUR_LETTRE.toInt()
childView.height = LARGEUR_LETTRE.toInt()
childView.setBackgroundResource(R.drawable.lettre)
childView.gravity = Gravity.CENTER
childView.text = lettre.toString()
childView.textSize = 34f
childView.setTypeface(null, Typeface.BOLD)
parentLayout.addView(childView, i - 1)
listLettre.add(childView)
listPos.add(i)
listIndex.add(i++)
}
val dummyRight = TextView(requireActivity())
listLettre.add(dummyRight)
listPos.add(i)
listIndex.add(i)
val premL = listLettre.drop(1).first()
val pad = (parentLayout.width - (tirage.size * LARGEUR_LETTRE.toInt())) / 2
set.clone(parentLayout)
set.connect(
premL.id,
ConstraintSet.START,
ConstraintSet.PARENT_ID,
ConstraintSet.START,
pad
)
val windowedList = listLettre.drop(1).dropLast(1).windowed(2, 1, false)
for (pair in windowedList)
set.connect(
pair.last().id,
ConstraintSet.START,
pair.first().id,
ConstraintSet.END
)
set.applyTo(parentLayout)
}
实际上 set.clear(view) 是从视图中删除所有约束,而不是视图本身。删除视图的命令是parentLayout.removeView(view),或者parentLayout.removeAllViews()将它们全部删除。