Here's the scenario: Activity contains fragment A
, which in turn uses getChildFragmentManager()
to add fragments A1
and A2
in its onCreate
like so:
getChildFragmentManager()
.beginTransaction()
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
So far, so good, everything is running as expected.
We then run the following transaction in the Activity:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(anim1, anim2, anim1, anim2)
.replace(R.id.fragmentHolder, new FragmentB())
.addToBackStack(null)
.commit()
During the transition, the enter
animations for fragment B
runs correctly but fragments A1 and A2 disappear entirely. When we revert the transaction with the Back button, they initialize properly and display normally during the popEnter
animation.
In my brief testing, it got weirder - if I set the animations for the child fragments (see below), the exit
animation runs intermittently when we add fragment B
getChildFragmentManager()
.beginTransaction()
.setCustomAnimations(enter, exit)
.replace(R.id.fragmentOneHolder, new FragmentA1())
.replace(R.id.fragmentTwoHolder, new FragmentA2())
.commit()
The effect I want to achieve is simple - I want the exit
(or should it be popExit
?) animation on fragment A
(anim2) to run, animating the whole container, including its nested children.
Is there any way to achieve that?
Edit: Please find a test case here
Edit2: Thanks to @StevenByle for pushing me to keep trying with the static animations. Apparently you can set animations on a per-op basis (not global to the whole transaction), which means the children can have an indefinite static animation set, while their parent can have a different animation and the whole thing can be committed in one transaction. See the discussion below and the updated test case project.
I was having the same issue with map fragment. It kept disappearing during the exit animation of its containing fragment. The workaround is to add animation for the child map fragment which will keep it visible during the exit animation of the parent fragment. The animation of the child fragment is keeping its alpha at 100% during its duration period.
Animation: res/animator/keep_child_fragment.xml
The animation is then applied when the map fragment is added to the parent fragment.
Parent fragment
Finally, the duration of the child fragment animation is set in a resource file.
values/integers.xml
So there seem to be a lot of different workarounds for this, but based on @Jayd16's answer, I think I've found a pretty solid catch-all solution that still allows for custom transition animations on child fragments, and doesn't require doing a bitmap cache of the layout.
Have a
BaseFragment
class that extendsFragment
, and make all of your fragments extend that class (not just child fragments).In that
BaseFragment
class, add the following:It does, unfortunately, require reflection; however, since this workaround is for the support library, you don't run the risk of the underlying implementation changing unless you update your support library. If you're building the support library from source, you could add an accessor for the next animation resource ID to
Fragment.java
and remove the need for reflection.This solution removes the need to "guess" the parent's animation duration (so that the "do nothing" animation will have the same duration as the parent's exit animation), and allows you to still do custom animations on child fragments (e.g. if you're swapping child fragments around with different animations).
I understand this may not be able to completely solve your problem, but maybe it will suit someone else's needs, you can add
enter
/exit
andpopEnter
/popExit
animations to your childrenFragment
s that do not actually move/animate theFragment
s. As long as the animations have the same duration/offset as their parentFragment
animations, they will appear to move/animate with the parent's animation.From the above answer of @kcoppock,
if you have Activity->Fragment->Fragments ( multiple stacking, the following helps ), a minor edit to the best answer IMHO.