Animating fragments and the back stack

26,990

Solution 1

The bug was fixed in the 3.2 release with the addition of the following new api:

http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)

It's to be noted that it has not yet been back-ported to the compatibility library (as mentioned in the bug report).

Solution 2

It's a bug, look at bug report 15623. One of the Android project members commented that the fix was too late for release 3.1 but it should make it into the next release.

The same member goes on to say that...

The problem is that the same animations are run on a pop operation as were run to put the fragments in their current places. For example, in the sliding example above, on a forward operation (pushing the old fragment onto the stack and moving the new fragment into view), we slide the old fragment out from the center to the left and slide the new fragment in from the right to the center. When the stack is popped, these same animations are run: the most recent fragment is animated 'out' by sliding it in from the right to the center (after which it disappears, since it's being removed). The old fragment is popped off the stack and animated from teh center to the left ... right off the screen.

Share:
26,990
Kelly Merrell
Author by

Kelly Merrell

VP of Engineering, Android at Mercury with experience working on top ranking apps for major news and media brands as well as hobby apps and the occasional game that may or may (probably) not ever make it to market.

Updated on July 09, 2022

Comments

  • Kelly Merrell
    Kelly Merrell almost 2 years

    I am having trouble using or understanding how popping FragmentTransactions off of the back stack handles the custom animations. Specifically, I expect it to call the "out" animation, but it doesn't seem to.

    I have a simple method to handle a fragment transaction (FragmentTransaction) where I add a fragment and apply a custom transition so that it will fade-in/fade-out. I am also adding this to the back stack so that the user can undo that transaction with the back button, essentially navigating to the state before the fragment was added.

    protected void changeFragment() { 
        FragmentTransaction ft = fm.beginTransaction(); 
        ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
        ft.add(R.id.fragment_container, new TestFragment()); 
        ft.addToBackStack(null); 
        ft.commit(); 
    } 
    

    Everything works great moving forward, but when the user clicks the back button, the transition animations do not reverse. What I expected was that when the fragment got removed, it would use the fade out animation. Instead it seems to pop out (without animation) and then the container seems to fade in. I'm not sure that this is exactly what is happening, but the fragment is definitely not fading out.

    My application uses the compatibility library to add fragment support, but I assume this to be applicable to Honeycomb (android-11) as well. Does anyone know if I am just doing something wrong here or if I am just expecting too much? Ideally, I would like to animate the fragments similarly to how Gmail (on the Xoom) does in regards to moving forward by clicking a message and then back by using the back button. Preferably not having to override the back button functionality and keep up with my own fragment state since I could have several "transactions" that I would want to back out of and I am not a fan of re-inventing wheels.

    Also asked on the Android Developers Group: http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9

  • blazeroni
    blazeroni over 12 years
    The latest release of the compatibility library (r4) now has this fix.
  • Nurbol
    Nurbol over 12 years
    I'm using the latest version of the compatibility library but whenever I try to call this I get an "Unknown animation name: objectAnimator" exception.
  • Snicolas
    Snicolas about 11 years
    With support, you can only use animations in xml, the old way, not object animator.