Подтвердить что ты не робот

Невозможно установить видимость в группе ограничений

Когда я пытаюсь установить видимость группы при нажатии кнопки, это не влияет на видимость вида. Использование 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)
    }
}

Моя активность_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>
4b9b3361

Ответ 1

Это похоже на ошибку. GONE работает, но INVISIBLE не делает, и я думаю, что это должно INVISIBLE. Может быть, стоит отчет об ошибке, если кто-то не может опубликовать мои мысли, что это неправильно. (Я использую constraint-layout:1.1.0-beta4.)

В то же время, это работа, которая явно извлекает идентификаторы внутри группы и устанавливает видимость каждого полученного вида.

В пределах 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.

Обновление: вот еще одна работа, которая использует тот факт, что изменение в/из GONE работает так, как ожидалось:

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

Ответ 2

Вы также можете просто вызвать метод requestLayout после изменения видимости Group на View.INVISIBLE.

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

Проблема в том, что android.support.constraint.Group обновляет видимость своих членов в методе updatePreLayout который вызывается из onMeasure в ConstraintLayout.

Ответ 3

android.support.constraint.Group имеет общедоступный метод

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

который обновляет видимость детей, поэтому вызов

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

работал на меня

Ответ 4

просто добавьте строку, которую вы можете изменить. так что это видно.

group.visibility=ConstraintLayout.GONE

Ответ 5

Просто очистите проект или перестройте свой проект