web-dev-qa-db-fra.com

animateLayoutChanges ne fonctionne pas bien avec une disposition imbriquée?

J'ai une disposition imbriquée comme la suivante:

 <LinearLayout>     <!----Parent layout--->
    <LinearLayout>    <!-----child 1--->
       ...
    </LinearLayout>   <!----child 1 ended--->
    <LinearLayout>    <!-----child 2--->
       ...
    </LinearLayout>   <!----child 2 ended--->
 </LinearLayout>    <!----Parent endded--->

Le problème que j'ai maintenant est que, puisque tous mes éléments de données se trouvent dans l'enfant 1 ou l'enfant 2 Linearlayout, si j'ajoute ou supprime un élément, la linéarisation enfant sera animée avec l'effet d'animationLayoutChanges mais la disposition parent ne le sera pas. faites n'importe quelle animation. (J'ai Android:animateLayoutChanges défini sur true pour toutes les dispositions linéaires). Surtout quand je supprime un élément de l'enfant 1, l'effet d'animation devient étrange (fondamentalement, l'enfant 2 va sauter pendant que l'enfant 1 fait toujours son animation).

Quelqu'un sait-il comment résoudre ce problème?

Merci

MISE À JOUR

Peu de temps après avoir posté cette question, je l'ai trouvée sur Android dans l'API LayoutTransition.

L'utilisation de LayoutTransition à plusieurs niveaux d'une hiérarchie de vues imbriquées peut ne pas fonctionner en raison de l'interrelation des différents niveaux de disposition.

Quelqu'un a-t-il donc des suggestions à faire pour ce problème?

40
Chen

La propriété animateLayoutChanges utilise LayoutTransitions, qui anime à la fois les enfants de la mise en page et, à partir de Android 4.0 et ultérieur, les ancêtres de la hiérarchie de la mise en page jusqu'à la en haut de l'arborescence. Dans Honeycomb, seuls les enfants de la mise en page seront animés. Voir this Android Blog du développeur pour plus de détails.

Malheureusement, il semble qu'il n'existe actuellement aucun moyen simple de faire réagir les frères et sœurs d'une mise en page à son LayoutTransitions. Vous pouvez essayer d'utiliser un TransitionListener pour être averti lorsque les limites de la mise en page sont modifiées et déplacer les vues frères en conséquence à l'aide d'Animators. Voir la deuxième réponse de Chet Haase dans ce post Google+ .

[~ # ~] modifier [~ # ~] - Il s'avère que est un moyen. Dans Android 4.1+ (API niveau 16+), vous pouvez utiliser un type de transition de mise en page CHANGING, qui est désactivé par défaut. Pour l'activer dans le code:

ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout);
LayoutTransition layoutTransition = layout.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);

Ainsi, dans votre exemple, pour avoir une mise en page enfant 2 animée, vous devez activer la transformation de mise en page CHANGING. La transformation serait alors appliquée lorsqu'il y a un changement dans les limites de son parent.

Voir cette vidéo DevBytes pour plus de détails.

79
Timo Hildén

Nous avions ajouté l'attribut Android: animateLayoutChanges à notre LinearLayout mais le changement n'a pas déclenché d'animation. Pour résoudre ce problème, utilisez ce code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition()
      .enableTransitionType(LayoutTransition.CHANGING);
}

Plus de détails .

5
beokh

Il semble qu'une transition retardée sur le parent fonctionne également pour l'animation. Au moins pour moi, le code suivant donne une animation appropriée pour développer/réduire.

expandTrigger.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        TransitionManager.beginDelayedTransition(parentLayout);
        expanded = !expanded;

        child1.setVisibility(expanded ? View.VISIBLE : View.GONE);
    }
});

Pour les dispositions profondément imbriquées, vous devrez parfois utiliser un parent plus haut dans la hiérarchie lors de l'appel à TransitionManager.

1
sihaya