43 votes

Impossible de définir la visibilité du groupe de contraintes

Lorsque j'essaie de définir la visibilité du groupe lors d'un clic sur le bouton, cela n'affecte pas la visibilité de la vue, en utilisant com.Android.support.constraint:constraint-layout:1.1.0-beta4. J'ai essayé de définir la visibilité par élément sans problème, 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>

0 votes

Avoir regardé este

0 votes

Quel est le problème, donnez le journal

0 votes

Il n'y a pas d'erreur dans le journal, mais il ne fait rien.

39voto

Cheticamp Points 22529

Mise à jour : Ce problème a été signalé comme corrigé dans la version 2.0.0 beta 6 de ConstraintLayout. Voir corrections de bogues pour ConstraintLayout 2.0.0 beta 6 .



Cela ressemble à un bug pour moi. GONE fonctionne mais INVISIBLE ne le fait pas et je pense que ça devrait. Cela vaut peut-être la peine de signaler un bogue, à moins que quelqu'un puisse indiquer où je me trompe. (J'utilise constraint-layout:1.1.0-beta4 .)

En attendant, voici une solution de contournement qui récupère explicitement les identifiants au sein du groupe et définit la visibilité de chaque vue récupérée.

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 le ConstraintLayout .

Mise à jour : Voici une autre solution de contournement qui tire parti du fait que le passage de/vers 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
    }
}

0 votes

Cela fonctionne mais j'espérais une solution qui ne nécessitait pas de faire une boucle dans les éléments. merci pour la réponse. j'espère que cela sera résolu.

0 votes

@SS2095 S'il s'agit d'un bug, vous devrez attendre une prochaine version. (Et je pense que c'est un bug.) C'est le mieux que l'on puisse faire en attendant si vous avez besoin de cette fonctionnalité.

0 votes

Quelqu'un a-t-il signalé ce bogue et possède-t-il un lien vers celui-ci ?

32voto

lukjar Points 1878

Vous pouvez aussi simplement appeler requestLayout après avoir changé la visibilité du groupe en 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 updatePreLayout qui est appelée à partir de onMeasure en ConstraintLayout .

2 votes

Merci, j'ai passé 2 jours à trouver cette solution 'requestLayout()' <3

0 votes

Merci ! Cela a fonctionné pour moi, mais cela peut-il être considéré comme un bug de la mise en page par contrainte ? L'appel à requestLayout() après chaque changement de visibilité ne semble pas tout à fait normal.

0 votes

Group.requestLayout() a réglé le problème pour moi aussi. Cela doit être un bug

6voto

Oliver1123 Points 61

Android.support.constraint.Group possède une méthode publique

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

qui met à jour les visibilités des enfants, donc appeler

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

a fonctionné pour moi

0 votes

Cette réponse est simple, fonctionne et utilise une méthode fournie par la bibliothèque. Ce devrait être la bonne réponse

0voto

Sushant Garg Points 108

Nettoyez votre projet ou reconstruisez votre projet.

0 votes

Cela n'a aucun sens que ce soit la solution, mais c'est le cas. Il est clair que quelque chose dans le groupe est bogué et probablement lié à Android Studio.

0 votes

Cela ne m'aide pas

0 votes

Veuillez partager votre code afin que nous puissions comprendre votre problème.

0voto

Divyesh Kalotra Points 159

Il suffit d'ajouter la ligne suivante pour la modifier. pour qu'il soit visible.

group.visibility=ConstraintLayout.GONE

3 votes

Je ne suis pas d'accord avec cette réponse, cette question concerne spécifiquement l'utilisation de View.INVISIBLE. L'utilisation de ConstraintLayout.GONE est identique à celle de View.GONE. Il s'agit d'un type différent de paramètre de visibilité qui fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X