web-dev-qa-db-fra.com

Impossible de définir la visibilité sur le groupe de contraintes

Lorsque j'essaie de définir la visibilité du groupe lors d'un clic de bouton, cela n'affecte pas la visibilité de la vue. L'utilisation de com.Android.support.constraint: constraint-layout: 1.1.0-beta4. J'ai essayé de le régler élément par élément sans problèmes, mais sans succès avec le groupe. 

Mon 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)
    }
}

Mon activité_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>
16
SS2095

Cela ressemble à un bug pour moi. GONE fonctionne mais INVISIBLE ne fonctionne pas et je pense que cela devrait. Cela peut valoir la peine d’avoir un rapport de bogue à moins que quelqu'un ne puisse poster où je pense mal. (J'utilise constraint-layout:1.1.0-beta4.)

En attendant, voici une solution de contournement qui extrait explicitement les identifiants au sein du groupe et définit la visibilité de chaque vue extraite.

Dans 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 est la ConstraintLayout.

Mise à jour: Voici un autre moyen de contourner le fait que le passage à/de GONE fonctionne comme prévu:

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

Vous pouvez également simplement appeler la méthode requestLayout après avoir défini la visibilité du groupe sur View.INVISIBLE

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

Le problème est que Android.support.constraint.Group met à jour la visibilité de ses membres dans la méthode updatePreLayout qui est appelée à partir de onMeasure dans ConstraintLayout.

10
lukjar

Il suffit de nettoyer votre projet ou de reconstruire votre projet

4
Sushant Garg

Android.support.constraint.Group a une méthode publique

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

qui met à jour les visibilités des enfants, appelant 

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

a travaillé pour moi

3
Oliver1123

ajoutez juste la ligne suivante, vous pouvez la changer .

group.visibility=ConstraintLayout.GONE
0
Divyesh Kalotra

Avait le même problème et rien d'en haut n'aide. Ma solution consistait à setVisibility(viewId, ConstraintSet.VISIBLE) dans l'ensemble de contraintes et à l'appliquer à la vue ConstraintLayout.

Par exemple:

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)
0
zoki