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>
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
}
}
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
.
Il suffit de nettoyer votre projet ou de reconstruire votre projet
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
ajoutez juste la ligne suivante, vous pouvez la changer .
group.visibility=ConstraintLayout.GONE
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)