Imbriqués les fragments de disparaître au cours de la transition de l'animation
Voici le scénario: Activité contient fragment A
, qui à son tour utilise getChildFragmentManager()
pour ajouter des fragments A1
et A2
dans son onCreate
comme suit:
getChildFragmentManager()
.beginTransaction()
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
Jusqu'ici tout va bien, tout se déroule comme prévu.
Nous puis exécutez la transaction suivante dans l'Activité:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(anim1, anim2, anim1, anim2)
.replace(R.id.fragmentHolder, new FragmentB())
.addToBackStack(null)
.commit()
Pendant la transition, la enter
animations pour fragment B
s'exécute correctement, mais fragments A1 et A2 disparaître entièrement. Lorsque nous revenions de la transaction avec le bouton de Retour, ils s'initialiser correctement et afficher normalement au cours de la popEnter
animation.
Dans mon bref essai, il a en plus étrange - si j'ai mis les animations pour les enfants fragments (voir ci-dessous), le exit
animation fonctionne par intermittence lorsque nous ajoutons fragment B
getChildFragmentManager()
.beginTransaction()
.setCustomAnimations(enter, exit)
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
L'effet que je veux réaliser est simple: je veux les exit
(ou devrait-il être popExit
?) animation sur fragment A
(anim2) d'exécuter, de l'animation de l'ensemble du récipient, y compris son imbriqués les enfants.
Est-il un moyen d'y parvenir?
Modifier: s'il vous Plaît trouver un cas de test ici
Edit2: Grâce à @StevenByle pour me pousser à continuer d'essayer avec la statique des animations. Apparemment, vous pouvez définir des animations sur les per-op (et non globale pour l'ensemble de la transaction), ce qui signifie que les enfants peuvent avoir une durée indéterminée statique de l'animation de jeu, alors que leurs parents peuvent avoir une animation différente et le tout peut être engagé dans une transaction. Voir la discussion ci-dessous et le mise à jour de cas de test du projet.
R.id.fragmentHolder
à l'égard d'Une, A1, A2, etc?fragmentHolder est un id dans l'activité de mise en page, fragment{Un,Deux}Titulaire sont dans Un fragment de la mise en page. Tous les trois sont distinctes. Fragment A été initialement ajouté dans fragmentHolder (j'. e., fragment B est le remplacement du fragment A).
J'ai créé un projet exemple ici: github.com/BurntBrunch/NestedFragmentsAnimationsTest , il y a aussi un apk inclus dans le référentiel. C'est vraiment un bug gênant et je suis à la recherche d'un moyen de le contourner (en supposant qu'il n'est pas dans mon code).
Je sais un peu plus sur ce problème maintenant. La raison pour laquelle les fragments de disparaître est parce que les enfants manipulent les événements de cycle de vie avant que le parent. En essence, A1 et A2 sont supprimés avant et depuis ils n'ont pas les animations, elles disparaissent brusquement. Une façon d'atténuer quelque peu ce qui est explicitement supprimer A1 et A2 dans la transaction qui remplace A. de Cette façon, ils s'animent lors de leur sortie, mais leur vitesse d'animation est au carré, depuis le conteneur parent est également l'animation. Une solution qui ne produit pas cet artefact serait appréciée.
Le changement(en remplacement du démarreur fragment) que vous mentionnez dans la question est le réel que vous voulez faire ou c'est juste un exemple? Vous pourrez appeler le
changeFragment
méthode qu'une seule fois?
OriginalL'auteur Delyan | 2013-02-15
Vous devez vous connecter pour publier un commentaire.
Afin d'éviter à l'utilisateur de voir le imbriquée fragments de disparaître lorsque le parent fragment est supprimé/remplacé dans une transaction que vous pourriez "simuler" une, ces fragments est toujours présente en fournissant une image d'eux, qu'ils apparaissaient sur l'écran. Cette image sera utilisée comme une base pour la imbriquée fragments contenant de sorte que même si le point de vue de la imbriquée fragment aller loin de l'image permettra de simuler leur présence. Aussi, je ne vois pas de perdre de l'interactivité avec le sous-fragment de vues comme un problème parce que je ne pense pas que vous voulez que l'utilisateur d'agir sur eux quand ils sont tout simplement en train de retirer(probablement comme une action de l'utilisateur).
J'ai fait un petit exemple avec la configuration de l'image d'arrière-plan(quelque chose de simple).
Wow, si sale. Les longueurs de nous les développeurs Android ont pour allez juste pour certains slickness
j'Ai un Viewpager à Partir de la Deuxième onglet je suis le remplacement d'autres fragment et quand je suis en appuyant sur la touche back sur ce j'ai besoin de montrer viewpager deuxième onglet,c'est l'ouverture, mais il affiche une page vierge. J'ai essayé ce que vous avez suggéré dans le fil au-dessus, mais encore il est le même.
Problème demeure lorsque l'utilisateur revient à @Harish a écrit
Wow sérieux? son 2018 et c'est encore une chose? 🙁
OriginalL'auteur Luksprog
Si il semble y avoir beaucoup de différentes solutions de contournement pour ce, mais basé sur @Jayd16 réponse, je crois que j'ai trouvé une bonne solution qui permet encore personnalisé, des animations de transition de l'enfant, des fragments, et ne nécessite pas de faire un cache bitmap de la mise en page.
Ont un
BaseFragment
classe qui étend la classeFragment
, et de faire toutes vos fragments d'étendre cette classe (et pas seulement de l'enfant fragments).Dans ce
BaseFragment
catégorie, ajoutez le texte suivant:Il n'a, malheureusement, exigent de la réflexion, cependant, puisque cette solution de contournement est de la bibliothèque de prise en charge, vous ne courez pas le risque de l'implémentation sous-jacente de changer, sauf si vous mettez à jour votre bibliothèque de prise en charge. Si vous êtes à la construction de la bibliothèque de prise en charge à partir de la source, vous pouvez ajouter un accesseur pour la prochaine animation ID de ressource pour
Fragment.java
et de supprimer le besoin de réflexion.Cette solution supprime la nécessité de "deviner" le parent de l'animation de la durée (de sorte que "ne rien faire" animation aura la même durée que la mère est sortie de l'animation), et vous permet de faire encore des animations personnalisées sur enfant fragments (par exemple, si vous êtes à la permutation enfant fragments autour de différentes animations).
Génial!!! Je vous remercie beaucoup. Simple, rapide, facile et pas moins efficace
Vous avez besoin de la nextAnim à partir de la parent fragment -- et non pas celui de l'enfant. C'est l'ensemble de point.
Merci pour ce très utile, cependant il demande un peu de mise à jour pour fonctionner avec la prise en charge actuelle de la bibliothèque (27.0.2, je ne sais pas quelle version a cassé ce code).
mNextAnim
est maintenant à l'intérieur d'unmAnimationInfo
objet. Vous pouvez y accéder comme ceci :Field animInfoField = Fragment.class.getDeclaredField("mAnimationInfo");
animInfoField.setAccessible(true);
Object animationInfo = animInfoField.get(fragment);
Field nextAnimField = animationInfo.getClass().getDeclaredField("mNextAnim");
voudrais plus d'ajouter une autre ligne de code après le vôtre.
val nextAnimResource = nextAnimField.getInt(animationInfo);
remplacer la ligneint nextAnimResource = nextAnimField.getInt(fragment);
OriginalL'auteur kcoppock
J'ai été en mesure de venir avec une assez propre solution. De l'OMI, de ses le moins hacky, et bien que cela soit techniquement la "dessiner une image bitmap" solution au moins de ses prélevée par le fragment lib.
Assurez-vous que votre enfant frags remplacer un parent de la classe:
Si nous avons une sortie d'animation sur l'enfant frags, ils seront animés au lieu de clignoter à l'écart. Nous pouvons exploiter ce en ayant une animation qui dessine simplement l'enfant des fragments d'alpha complet pour une durée. De cette façon, ils vont rester visible dans le fragment en tant que parent, il anime, en donnant le comportement souhaité.
La seule question que je peux penser à est de garder la trace de cette durée. Je pourrais peut-être mis à un grand-ish numéro, mais j'ai peur que pourraient avoir des problèmes de performance si ce n'est que le dessin d'animation quelque part.
Il fonctionne pour moi aussi. GG 🙂
Il aide, merci. La valeur de la durée de temps n'a pas d'importance
solution la plus propre jusqu'à présent
Nice, merci beaucoup!
OriginalL'auteur Jayd16
Je comprends que cela peut ne pas être en mesure de complètement résoudre votre problème, mais peut-être qu'il conviendra de quelqu'un d'autre besoins, vous pouvez ajouter
enter
/exit
etpopEnter
/popExit
des animations pour vos enfantsFragment
s qui ne sont pas réellement déplacer/animer leFragment
s. Aussi longtemps que les animations ont la même durée/décalage comme parentFragment
animations, ils semblent se déplacer/s'anime avec le parent de l'animation.D'accord, c'est plus une solution de contournement que l'étanchéité de la solution, et peut être considéré comme légèrement fragile. Mais il va travailler pour les cas simples.
OriginalL'auteur Steven Byle
vous pouvez le faire à l'enfant fragment.
OriginalL'auteur peng gao
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
EDIT:
J'ai fini par unimplementing cette solution comme il y avait d'autres problèmes. Square a récemment sorti avec 2 bibliothèques qui remplacent les fragments. Je dirais que cela pourrait effectivement être une meilleure alternative que d'essayer de pirater des fragments d'en faire quelque chose de google ne veut pas d'eux en train de faire.
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
J'ai pensé que je l'avais mis en place cette solution pour aider les gens qui ont ce problème à l'avenir. Si vous suivre à travers les affiches originales conversation avec d'autres personnes, et de regarder le code, il a affiché, vous verrez l'affiche originale vient finalement à la conclusion de l'utilisation d'un no-op animation sur l'enfant fragments, alors que l'animation de la mère fragment. Cette solution n'est pas idéale car elle vous oblige à garder la trace de tous les enfants des fragments, ce qui peut être gênant lors de l'utilisation d'un ViewPager avec FragmentPagerAdapter.
Depuis que j'ai utiliser de l'Enfant Fragments de partout j'ai trouvé cette solution qui est efficace et modulaire (de sorte qu'il peut être facilement retiré) dans le cas où elles de la réparer, et ce non-op animation n'est plus nécessaire.
Il ya beaucoup de façons dont vous pouvez le mettre en œuvre. J'ai choisi d'utiliser un singleton, et je l'appelle ChildFragmentAnimationManager. Essentiellement, il va garder la trace d'un enfant fragment pour moi sur la base de ses parents et leur appliquer un no-op d'animation pour les enfants lors de la demande.
Ensuite, vous devez avoir une classe qui étend la classe Fragment que tous vos Fragments étendre (au moins votre Enfant Fragments). J'ai déjà eu cette classe, et je l'appelle BaseFragment. Lors de l'un des fragments de vue est créée, nous l'ajoutons à la ChildFragmentAnimationManager, et l'enlever quand il est détruit. Vous pouvez faire cela onAttach/Détacher, ou d'autres méthodes d'appariement dans la séquence. Ma logique pour le choix de Créer ou de Détruire de la Vue parce que si un Fragment n'est pas un point de Vue, je ne se soucient pas de l'animation de continuer à être vu. Cette approche devrait également mieux travailler avec ViewPagers que l'utilisation de Fragments que vous ne serez pas garder la trace de chaque Fragment unique d'un FragmentPagerAdapter est tenue, mais plutôt que 3.
Maintenant que tous vos Fragments sont stockées dans la mémoire par le parent fragment, vous pouvez appeler animer sur eux comme ça, et votre enfant fragments ne disparaîtra pas.
Aussi, si vous l'avez, ici, c'est le no_anim.xml fichier qui va dans votre res/anim dossier:
Encore une fois, je ne pense pas que cette solution est parfaite, mais c'est beaucoup mieux que pour chaque exemple vous avez un Enfant Fragment, la mise en œuvre du code personnalisé dans le parent fragment de garder une trace de chaque enfant. J'ai été là, et il n'est pas amusant.
OriginalL'auteur spierce7
Je crois que j'ai trouvé une meilleure solution à ce problème que les instantanés de l'actuel fragment d'une image bitmap en tant que Luksprog suggéré.
L'astuce est de cacher le fragment étant supprimés ou détaché et seulement après que les animations ont été achevés le fragment est supprimé ou détaché dans son propre fragment de transaction.
Imaginer que nous avons
FragmentA
etFragmentB
, à la fois avec des sous-fragments. Maintenant, quand vous le feriez normalement:Au lieu de cela, vous ne
Maintenant pour la mise en œuvre du Fragment:
OriginalL'auteur Danilo
J'ai eu le même problème avec le fragment de carte. Il l'a gardé en train de disparaître lors de la sortie de l'animation de son contenant le fragment. La solution est d'ajouter une animation pour les enfants fragment de carte qui va le garder visible lors de la sortie de l'animation de la mère fragment. L'animation de l'enfant fragment est de garder son alpha à 100% au cours de la période de durée.
Animation: res/animator/keep_child_fragment.xml
L'animation est ensuite appliquée lorsque le fragment de carte est ajoutée à la mère fragment.
Parent fragment
Enfin, la durée de l'enfant fragment d'animation est définie dans un fichier de ressources.
values/integers.xml
OriginalL'auteur Evgenii
Pour animer dissapearance de neasted fragments nous pouvons forcer pop pile de retour sur ChildFragmentManager. Cela déclenche animation de transition. Pour ce faire nous avons besoin de rattraper OnBackButtonPressed événement ou d'écouter pour la backstack changements.
Ici est de donner l'exemple avec code.
OriginalL'auteur Mateusz Biedron
J'ai récemment rencontré ce problème dans ma question: Imbriqués les fragments de la transition de manière incorrecte
J'ai une solution qui permet de résoudre ce sans sauvegarde d'une image bitmap, ni en utilisant la réflexion ou de tout autre insatisfaisant méthodes.
Un exemple de projet peuvent être consultés ici: https://github.com/zafrani/NestedFragmentTransitions
Un GIF de l'effet peut être consultée ici: https://imgur.com/94AvrW4
Dans mon exemple il y a 6 enfants fragments, répartis entre les deux parents fragments. Je suis en mesure de réaliser les transitions d'entrée, de sortie, de la pop et push sans aucun problème. Les modifications de la Configuration et à l'arrière de l'appareil sont également traitée avec succès.
La majeure partie de la solution est dans mon BaseFragment (le fragment prolongée par mes enfants et parents fragments) onCreateAnimator fonction qui ressemble à ceci:
L'activité et parent fragment sont responsables de l'établissement des états de ces booléens. Il est plus facile de voir comment et d'où mon exemple de projet.
Je ne suis pas à l'utilisation d'un support de fragments dans mon exemple, mais la même logique peut être utilisée avec eux et leur onCreateAnimation fonction
OriginalL'auteur zafrani
Une façon simple de résoudre ce problème est l'utilisation de la
Fragment
classe à partir de cette bibliothèque à la place de la bibliothèque standard fragment de classe:https://github.com/marksalpeter/contract-fragment
Comme une note côté, le paquet contient également un utile délégué modèle appelé
ContractFragment
que vous pourriez trouver utiles pour la construction de vos applications tirant parti de la mère-enfant fragment de la relation.OriginalL'auteur Mark Salpeter
De la réponse ci-dessus de @kcoppock,
si vous avez une Activité->Fragment->Fragments ( plusieurs à empiler, à la suite contribue ), une modification mineure à la meilleure réponse à mon humble avis.
OriginalL'auteur alekshandru
Mon problème était le parent fragment de suppression (pi.supprimer(fragment)), de l'enfant, les animations n'étaient pas passe.
Le problème de base est que l'enfant fragments sont immédiatement DÉTRUITS AVANT que les parents fragment de la sortie de l'animation.
Enfant fragments de personnaliser l'animation ne soit pas exécutée sur Parent Fragment de suppression de
Comme d'autres l'ont échappé à, se cachant le PARENT (et pas à l'enfant) avant d'être PARENT de l'enlèvement est le chemin à parcourir.
Si vous souhaitez réellement supprimer le parent, vous devriez probablement mettre en place un listener sur vous animation personnalisée à savoir lorsque l'animation est terminée, alors vous pouvez faire en toute sécurité certains de finalisation sur le Parent Fragment (supprimer). Si vous ne le faites pas, en temps opportun, vous pourriez finir par tuer l'animation. N. B animation est réalisée sur asynchrones file d'attente de sa propre.
BTW, vous n'avez pas besoin d'animations personnalisées sur l'enfant fragment, car ils hériteront de la mère animations.
OriginalL'auteur Ed Manners