无法在约束组

时间:2017-12-18 09:30:26

标签: android kotlin android-constraintlayout kotlin-android-extensions

当我尝试在按钮单击时设置组的可见性时,它不会影响视图的可见性。使用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>

6 个答案:

答案 0 :(得分:19)

对我来说这看起来像个错误。 GONE有效但INVISIBLE没有,我认为应该这样做。它可能值得一个错误报告,除非有人可以发布我认为错误的地方。 (我正在使用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
    }
}

mLayoutConstraintLayout

更新:以下是另一项解决方案,它利用了更改为/ GONE的工作原理:

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

答案 1 :(得分:15)

您还可以在将群组展示次数更改为requestLayout后调用View.INVISIBLE方法。

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

android.support.constraint.Group具有公共方法

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

会更新儿童的可见性,因此致电

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

为我工作

答案 4 :(得分:0)

只需添加关注行即可更改。 所以它可见。

group.visibility=ConstraintLayout.GONE

答案 5 :(得分:0)

遇到相同的问题,以上内容无济于事。我的解决方案是在约束集中的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)