无法在约束组上设置可见性

SS2*_*095 31 android kotlin kotlin-android-extensions android-constraintlayout

当我尝试在按钮单击时设置组的可见性时,它不会影响视图的可见性.使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

Che*_*amp 28

对我来说这看起来像个错误.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
    }
}
Run Code Online (Sandbox Code Playgroud)

mLayout是的ConstraintLayout.

更新:这是另一种解决方案,它利用了更改为/ GONE按预期工作的事实:

private fun toggleLoginUI(show: Boolean) {
    if (show) {
        group.visibility = GONE
        group.visibility = VISIBLE
    } else {
        group.visibility = GONE
        group.visibility = INVISIBLE
    }
}
Run Code Online (Sandbox Code Playgroud)


luk*_*jar 24

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

fun makeGroupInvisible(group: Group) {
    group.visibility = View.INVISIBLE
    group.requestLayout()
}
Run Code Online (Sandbox Code Playgroud)

问题是,android.support.constraint.Group它的成员在更新可视性updatePreLayout的方法是从所谓onMeasureConstraintLayout.

  • Thx,花了2天时间才找到'requestLayout()'求解器&lt;3 (2认同)

Oli*_*123 5

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

 public void updatePreLayout(ConstraintLayout container) {
   ...
 }
Run Code Online (Sandbox Code Playgroud)

更新儿童的能见度,所以打电话

dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
Run Code Online (Sandbox Code Playgroud)

为我工作