2012-01-16 9 views
74

Quiero intercambiar dos fragmentos en una actividad mediante animación. Suponer que PageA es para el fragmento A y el lado izquierdo en la pantalla y PageB 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, entonces, PageA se moverá al lado derecho de la pantalla con alguna animación de transición.fragmento de intercambio en una actividad mediante animación

He probado 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 de antemano.

+1

posible duplicado de [Animar la transición entre fragmentos] (http://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments) – TalkLittle

Respuesta

247

Antiguo questiion y es probable que ya lo descubrió, pero para referencia futura:

esto es lo que se utiliza para establecer una animación personalizada cada vez que cambie un fragmento a través de 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í es una 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 y el SDK con soporte nativo para la FragmentManager continuación, la 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 es compatible con el nuevo tipo objectAnimator y en lugar de solamente poner en práctica el marco de animación de edad.

+79

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 debe usar si desea obtener el mejor comp? –

+17

Estas diferentes animaciones no son exactamente iguales. Estás asumiendo que el ancho de tu fragmento es 1280 usando un valor desde -1280. Si el ancho es mayor, no comenzará completamente fuera de la pantalla. – egfconnor

Cuestiones relacionadas