Estoy usando Google API 8 (Android 2.2) con el paquete de soporte v4.
No da ningún error ni animación.
Transacción:
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();
Animaciones:
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="700"
android:fromXDelta="-100%"
android:toXDelta="0%" >
</translate>
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="700"
android:fromXDelta="0%"
android:toXDelta="100%" >
</translate>
</set>
¿Alguien sabe lo que está pasando aquí?
Respuestas:
El administrador estaba apilando mi transacción antes de que estableciera la animación, por lo que apila la transacción sin animaciones (triste pero cierto), y eso ocurre incluso si realizo la transacción después del
setCustomAnimations()
.La solución es configurar las animaciones primero:
FragmentTransaction transaction = manager.beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); transaction.replace(R.id.content, myFragment); transaction.commit();
fuente
transaction.something().somethingelse().replace().commit()
, muchos de los métodos de Android regresanthis
para que pueda evitar volver a escribir la variable, pero de alguna manera aquí expone un efecto secundario ysetCustomAnimations()
debe llamarse por separadotransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
en su lugar.Como se sugirió anteriormente, las declaraciones separadas definitivamente funcionarán. Pero el truco aquí es
setCustomAnimation
antes de configurar el tipo de transacción a saber.add
,replace
etc. de lo contrario, no lo hará. Entonces, aplicar la misma lógicamethod chaining
también funciona. p.ej.getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.a_slide_up, R.anim.a_slide_down, R.anim.a_slide_up, R.anim.a_slide_down) .add(R.id.root_layout, MyFrag.newInstance()) .addToBackStack("MyFrag") .commit();
Poniéndolo aquí, para que alguien que lo prefiera lo
method chaining
encuentre útil. ¡Salud!fuente
Dejando esto aquí porque es la pregunta más popular. Tuve el mismo problema con la transacción de fragmentos que no se animaba. El culpable fue tener el atributo
android:animateLayoutChanges
establecido entrue
en el diseño contenedor.Espero que ayude a alguien a ahorrar algo de tiempo en la búsqueda de una solución, ya que puede ser difícil de notar cuando se tienen diseños anidados en diferentes archivos.
fuente
Otra razón puede ser colocar innecesariamente
fragmentTransaction.show()
antes del compromiso. Esto hace que las transiciones emergentes no se muestren en algunas versiones de API de Android.fuente