无法设置约束组的可见性

Can't set visibility on constraint group

当我尝试在单击按钮时设置组的可见性时,它不会影响视图的 visibility.Using com.android.support.constraint:constraint-layout:1.1.0-beta4。我试过按元素设置它没有问题,但在小组中没有成功。

我的MainActivity.kt

private fun toggleLoginUI(show: Boolean) {
    if (show) {
        group.visibility = VISIBLE
    } else {
        group.visibility = INVISIBLE
    }
}

fun onClick(view: View) {
    when (view.id) {
        R.id.button -> toggleLoginUI(true)
        R.id.button4 -> toggleLoginUI(false)
    }
}

我的activity_main.xml

    <android.support.constraint.ConstraintLayout..

            <TextView
                android:id="@+id/textView"
... />

            <TextView
                android:id="@+id/textView2"
... />

            <Button
                android:id="@+id/button"
.../>

            <Button
                android:id="@+id/button4"
... />


            <android.support.constraint.Group
                android:id="@+id/group"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="visible"
                app:constraint_referenced_ids="textView,textView2" />
            </android.support.constraint.ConstraintLayout>

只需添加后续行即可进行更改。 所以它可见。

group.visibility=ConstraintLayout.GONE

更新: 据报道,这已在 ConstraintLayout 版本 2.0.0 beta 6 中修复。参见 bug fixes for ConstraintLayout 2.0.0 beta 6



我觉得这像是一个错误。 GONE 有效,但 INVISIBLE 无效,我认为应该有效。除非有人可以 post 我的想法是错误的,否则它可能值得一个错误报告。 (我正在使用 constraint-layout:1.1.0-beta4。)

与此同时,这里有一个解决方法,可以显式检索组内的 ID 并设置每个检索到的视图的可见性。

MainActivity.kt

以内
private fun toggleLoginUI(show: Boolean) {
    if (show) {
        setGroupVisibility(mLayout, group, Group.VISIBLE)
    } else {
        setGroupVisibility(mLayout, group, Group.INVISIBLE)
    }
}

private fun setGroupVisibility(layout: ConstraintLayout, group: Group, visibility: Int) {
    val refIds = group.referencedIds
    for (id in refIds) {
        layout.findViewById<View>(id).visibility = visibility
    }
}

mLayout 就是 ConstraintLayout.

更新: 这是另一个解决方法,它利用了更改 to/from GONE 按预期工作的事实:

private fun toggleLoginUI(show: Boolean) {
    if (show) {
        group.visibility = GONE
        group.visibility = VISIBLE
    } else {
        group.visibility = GONE
        group.visibility = INVISIBLE
    }
}

您也可以在将组可见性更改为 View.INVISIBLE 后简单地调用 requestLayout 方法。

fun makeGroupInvisible(group: Group) {
    group.visibility = View.INVISIBLE
    group.requestLayout()
}

问题是 android.support.constraint.GroupupdatePreLayout 方法中更新其成员的可见性,该方法从 ConstraintLayout 中的 onMeasure 调用。

android.support.constraint.Group 有一个 public 方法

 public void updatePreLayout(ConstraintLayout container) {
   ...
 }

更新 children 可见性,因此调用

dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)

对我有用

只需清理您的项目或重建您的项目

遇到了同样的问题,上面的任何帮助都没有。我的解决方案是 setVisibility(viewId, ConstraintSet.VISIBLE) 内部约束集并将其应用于 ConstraintLayout 视图。

例如:

myContstraintSet.apply {
    setVisibility(firstGroup.id, ConstraintSet.VISIBLE)
    setVisibility(secondGroup.id, ConstraintSet.GONE)

    connect(oneView.id, ConstraintSet.BOTTOM, R.id.secondView, ConstraintSet.TOP)
    clear(anotherView.id, ConstraintSet.TOP)
}
myContstraintSet.applyTo(myConstraintLayout)