intercambiar fragmentos en una actividad mediante animación

94

Quiero intercambiar dos fragmentos en una actividad a través de la animación. Supongamos que la página A es para el fragmento A y el lado izquierdo de la pantalla y la página B es para el fragmento B, es decir, en el lado derecho de la pantalla. Ahora quiero que cuando haga clic en un botón en la página A, la página A se moverá al lado derecho de la pantalla con una animación de transición.

Probé el siguiente código para reemplazar la posición

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Buscando alguna pista.

Gracias por adelantado.

Deepak Goel
fuente
1
posible duplicado de Animar la transición entre fragmentos
TalkLittle

Respuestas:

282

Antigua misión y probablemente ya la hayas descubierto, pero para referencia futura:

esto es lo que usa para configurar una animación personalizada cuando reemplaza un fragmento a través del código:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Aquí hay un ejemplo de la animación slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Tenga en cuenta que esta es la animación si está utilizando la biblioteca de compatibilidad. En cambio, si está utilizando un SDK con soporte nativo para FragmentManager, su animación se verá así:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Esto se debe a que la biblioteca de compatibilidad no admite el nuevo tipo objectAnimator y, en su lugar, solo implementa el marco de animación anterior.

sciutand
fuente
92
Esta es definitivamente la respuesta correcta. ¡Tenga en cuenta que el orden es importante! ¡Debe tener la llamada setCustomAnimations () antes de agregar / reemplazar llamadas!
theelfismike
2
Entonces, ¿qué enfoque debería utilizar si desea la mejor composición?
basickarl
17
Estas diferentes animaciones no son exactamente iguales. Está asumiendo que el ancho de su fragmento es igual a 1280 usando un valor de -1280. Si el ancho es mayor, no se iniciará completamente fuera de la pantalla.
egfconnor
53
En su lugar, puede usar las animaciones predefinidas del espacio de nombres de Android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy
2
Las animaciones predefinidas activan una excepción de tiempo de ejecución, FWIW, porque dependen de la etiqueta "translate".