Animating fragments and the back stack

Kelly Merrell picture Kelly Merrell · Mar 16, 2011 · Viewed 26.8k times · Source

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

Answer

user742030 picture user742030 · Jun 8, 2012

I use this:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

and the transitions work in reverse when the back button is presses.