Android Fragmentos y animación
¿Cómo debe implementar el tipo de deslizamiento que, por ejemplo, el cliente Honeycomb Gmail utiliza?
TransactionManager
puede manejar esto automáticamente mediante la adición y la eliminación de los fragmentos, es algo difícil de probar esto debido a que el emulador es una presentación de diapositivas 🙂
- Cómo saber si un Fragmento fue recreado o retenido
- Cómo utilizar onSaveInstanceState
- ViewPager + Fragmentos - Fragmento no mostrado
- Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas." Error en Fragmento
- Cómo reemplazar un DialogFragment por otro DialogFragment?
- Cambiar la orientación de Android: Diferentes diseños, los mismos fragmentos
- ¿Cómo crear correctamente un Tablayout ahora que la Tabactivity está obsoleta?
- onCreateView () no se llama inmediatamente después de FragmentTransaction.commit ()
- ViewPager con una página que contiene varios fragmentos "java.lang.IllegalArgumentException: No se encontró ninguna vista para id"
- Fragmento de fragmento de Android como fragmento de diálogo o fragmento habitual
- Android: No se puede obtener la transición de elementos compartidos para trabajar con Google Maps Fragment
- OnActivityResult () no llamado cuando la actividad se inició desde el fragmento
- ¿Cómo pasar de managedQuery a LoaderManager / CursorLoader?
Para animar la transición entre fragmentos o para animar el proceso de mostrar u ocultar un fragmento, utilice el Fragment Manager
para crear una Fragment Transaction
.
Dentro de cada transacción de fragmentos puede especificar animaciones de entrada y salida que se utilizarán para mostrar y ocultar respectivamente (o ambos cuando se utilice reemplazar).
El siguiente código muestra cómo reemplazar un fragmento deslizando un fragmento y deslizando el otro en su lugar.
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); DetailsFragment newFragment = DetailsFragment.newInstance(); ft.replace(R.id.details_fragment_container, newFragment, "detailFragment"); // Start the animated transition. ft.commit();
Para lograr lo mismo con ocultar o mostrar un fragmento que simplemente llamaría ft.show
o ft.hide
, pasando en el fragmento que desea mostrar u ocultar, respectivamente.
Para referencia, las definiciones de animación XML utilizarían la etiqueta objectAnimator
. Un ejemplo de slide_in_left podría ser algo como esto:
<?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>
Si no tienes que usar la biblioteca de soporte, echa un vistazo a la respuesta de Roman .
Pero si quieres usar la biblioteca de soporte , tienes que usar el antiguo framework de animación como se describe a continuación.
Después de consultar las respuestas de Reto y blindstuff he conseguido el siguiente código funcionando.
Los fragmentos aparecen deslizándose hacia adentro desde la derecha y deslizándose hacia la izquierda cuando se presiona.
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); CustomFragment newCustomFragment = CustomFragment.newInstance(); transaction.replace(R.id.fragment_container, newCustomFragment ); transaction.addToBackStack(null); transaction.commit();
La orden es importante. Esto significa que debe llamar a setCustomAnimations()
antes de replace()
o la animación no tendrá efecto!
A continuación, estos archivos deben colocarse dentro de la carpeta res / anim .
Enter.xml :
<?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="@android:integer/config_mediumAnimTime"/> </set>
Exit.xml :
<set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="-100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
Pop_enter.xml :
<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="@android:integer/config_mediumAnimTime"/> </set>
Pop_exit.xml :
<?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
La duración de las animaciones se puede cambiar a cualquiera de los valores predeterminados como @android:integer/config_shortAnimTime
o cualquier otro número.
Tenga en cuenta que si entre los reemplazos de fragmentos se produce un cambio de configuración (por ejemplo, rotación), la acción posterior no está animada. Se trata de un error documentado que aún existe en la rev 20 de la biblioteca de soporte.
Mi biblioteca de soporte modificada admite el uso de las animaciones View (es decir, <translate>, <rotate>
) y Object Animators (es decir, <objectAnimator>
) para Fragment Transitions. Se implementa con NineOldAndroids . Consulte mi documentación en github para más detalles.
Yo soluciono esto de la manera Abajo
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide); fg.startAnimation(anim); this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
- ¿Existe un ID exclusivo de dispositivo Android?
- Cómo utilizar putExtra () y getExtra () para los datos de cadena