Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pop the fragment backstack without playing the Pop-Animation

I push a fragment on the fragment stack using the following code:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right,      R.anim.slide_in_left, R.anim.slide_out_left); fragmentTransaction.replace(getId(), newFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); 

This way, when the fragment stack is popped, e.g. by pressing the back button, a fragment pop animation is played. However, there are situations in which i would like to pop the fragment backstack without showing this animation, e.g. because I just returned from another activity and want to display the previous fragment at once, without animation.

An example navigation could look like this:

  • The user is on the start screen with the root fragment
  • He selects an item on the root fragment which then displays a new fragment to show details of that item. It does so using a fragment transaction that sets animations both for the push and the pop case (so when the user presses the back button, the transition is animated)
  • From this fragment he starts an activity which (for whatever reason) deletes the item that was just shown
  • When this activity finishes, I would like to return to the root fragment without showing the "pop animation" of the "detail fragment"

Is there a way to pop the fragment backstack without playing the specified pop animation?

like image 237
ChristophK Avatar asked Feb 08 '12 13:02

ChristophK


2 Answers

So Warpzit was on the right track, he just didn't address your specific issue too well. I came across the exact same issue and here is how I solved it.

First I created a static boolean variable (for simplicity's sake, lets put it in the FragmentUtils class)...

public class FragmentUtils {     public static boolean sDisableFragmentAnimations = false; } 

Then, in EVERY fragment you have, you need to override the onCreateAnimation method...

@Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {     if (FragmentUtils.sDisableFragmentAnimations) {         Animation a = new Animation() {};         a.setDuration(0);         return a;     }     return super.onCreateAnimation(transit, enter, nextAnim); } 

Then, when you need to clear the backstack from your activity simply do the following...

public void clearBackStack() {     FragmentUtils.sDisableFragmentAnimations = true;     getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);     FragmentUtils.sDisableFragmentAnimations = false; } 

And voila, a call to clearBackStack() will drop you back into the root fragment without any transition animations.

Hopefully the big G will add a less stupid way of doing this in the future.

like image 68
Geoff Avatar answered Sep 19 '22 14:09

Geoff


So for the support library following works:

In the fragment which should have a custom pop animation you override the onCreateAnimation with your own custom one. You could get it and set some kind of parameter depending on what you want. There might need to be done some extra work to make it work with regular fragments.

Here is the example where I'm overriding it and changing the set duration:

@Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {     Animation anim = (Animation) super.onCreateAnimation(transit, enter, nextAnim);     if(!enter) {         if(anim != null) {             anim.setDuration(0); // This doesn't seem to be called.             return anim;         } else {             Animation test = new TestAnimation();             test.setDuration(0);             return test;         }     }     return anim; }  private class TestAnimation extends Animation {  } 
like image 24
Warpzit Avatar answered Sep 19 '22 14:09

Warpzit