54

Tengo problemas para usar o comprender cómo aparece FragmentTransactions fuera de la pila posterior maneja las animaciones personalizadas . Específicamente, espero que llame a la animación "out", pero no parece.Animación de fragmentos y la pila posterior

I tienen un método sencillo de manejar una transacción fragmento (FragmentTransaction) donde agrego un fragmento y aplicar una transición de encargo de modo que se desvanecerá-in/fade-out. También estoy agregando esto a la pila posterior para que el usuario pueda deshacer esa transacción con el botón Atrás , navegando esencialmente al estado antes de que se haya agregado el fragmento .

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(); 
} 

Todo funciona muy bien seguir adelante, pero cuando el usuario hace clic en el botón espalda, las animaciones de transición no revierten. Lo que esperaba era que cuando se eliminaba el fragmento, usaría la animación de fundido de salida . En su lugar, parece salirse (sin animación) y luego el contenedor parece desvanecerse. No estoy seguro de que esto sea exactamente lo que está sucediendo , pero el fragmento definitivamente no se está desvaneciendo.

Mi aplicación utiliza la biblioteca de compatibilidad para agregar soporte de fragmentos, , pero supongo que esto también se aplica a Honeycomb (android-11). ¿Alguien sabe si estoy haciendo algo mal aquí o si estoy esperando demasiado? Idealmente, me gustaría animar los fragmentos de forma similar a como lo hace Gmail (en el Xoom) en relación con al avanzar haciendo clic en un mensaje y luego volver utilizando el botón Atrás . Preferiblemente no tener que anular la funcionalidad del botón Atrás y mantenerse al día con mi propio estado de fragmento ya que podría tener varias "transacciones" de las que me gustaría dar marcha atrás y soy que no soy fanático de reinventar las ruedas.

también pidió en el Grupo Desarrolladores de Android: http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9

+3

También encontré este problema y envié un informe de error aquí http://code.google.com/p/android/issues/detail?id=15623&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars – Damian

+0

Por favor, puede usted estrella el informe de error anterior. – Damian

+0

Estrellado. Gracias por enviar eso como un boog. Quería obtener otra opinión antes de hacerlo. –

Respuesta

29

El error se corrigió en la versión 3.2 con la adición de la siguiente nueva API:

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

Es de señalar que aún no ha sido retro-portado a la biblioteca de compatibilidad (como se menciona en el informe de error).

+1

La última versión de la biblioteca de compatibilidad (r4) ahora tiene esta solución. – blazeroni

+1

Estoy usando la última versión de la biblioteca de compatibilidad, pero cada vez que intento llamar a esto obtengo una excepción de "Nombre de animación desconocido: ObjectAnimator". – powerj1984

+0

Con soporte, solo puedes usar animaciones en xml, como antes, no animador de objetos. – Snicolas

5

Es un error, mira a bug report 15623. Uno de los miembros del proyecto de Android comentó que la solución era demasiado tarde para el lanzamiento 3.1, pero debería llegar a la próxima versión.

El mismo miembro va a decir que ...

El problema es que los mismos animaciones se ejecutan en una operación emergente como se corrieron para poner los fragmentos de sus lugares actuales. Por ejemplo, en el ejemplo de deslizamiento anteriormente, en una operación de avance (empujando el viejo fragmento en la pila y moviendo el nuevo fragmento en vista), que deslice el fragmento de edad fuera desde el centro a la izquierda y diapositiva el nuevo fragmento en de la derecha al centro. Cuando se extrae la pila , estas mismas animaciones se ejecutan: el fragmento más reciente es animado 'hacia fuera' deslizándolo desde la derecha hacia el centro (después de lo cual desaparece, ya que está siendo eliminados). El fragmento anterior aparece fuera de la pila y se anima desde el centro a la izquierda ...directamente desde la pantalla .

49

Yo uso este:

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

y las transiciones funcionan a la inversa, cuando el botón de retroceso es prensas.

+10

Usted, señor, es un Dios entre los hombres. – Guardanis

+0

perfecto! ¡muchas gracias! – datayeah

+0

que fue una solución fácil –

Cuestiones relacionadas