Fragmento ReenterTransition no funciona. Necesita ayuda para aclarar las distintas transiciones de Fragmento
Estoy implementando animaciones de transición Fragment entre los elementos en un RecyclerView, y un fragmento que muestra los detalles del elemento pulsado. En otras palabras, la relativamente común …
"Haga clic en una tarjeta en una lista y se expande a una vista detallada mientras el resto de la lista desaparece"
…Tipo de cosa.
La transición desde el elemento RecyclerView a la vista detallada funciona bien. Los elementos compartidos del elemento están pasando a su nuevo estado mientras que el resto de los elementos de RecyclerView se desvanecen.
Sin embargo, cuando el BackStack se coloca la transición de elementos compartidos de nuevo a su estado anterior, pero los otros elementos RecyclerView no se desvanecen de nuevo. Aparecen al instante al principio de la animación en su lugar, como se puede ver en esta pantalla de vídeo
La actividad maneja bastantes fragmentos, así que hago la transacción en el siguiente método generalizado:
@TargetApi(Build.VERSION_CODES.LOLLIPOP) public void setFragment(int fragId, Bundle args, List<Pair> transitionViews, String tag, int containerId) { // Setup the new fragment and transaction Fragment newFragment = FragmentFactory.newFragment(fragId, args); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(containerId, newFragment, tag); fragmentTransaction.addToBackStack(tag); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && transitionViews != null) { // Add the shared elements for (int i = 0; i < transitionViews.size(); i++) { final Pair pair = transitionViews.get(i); fragmentTransaction.addSharedElement((View) pair.first, (String) pair.second); } // Setup the transitions Transition transitionMove = TransitionInflater.from(this).inflateTransition(android.R.transition.move); Transition transitionFade = TransitionInflater.from(this).inflateTransition(android.R.transition.fade); // transitionFade.setDuration(500); // Slow down the transition to help see what's happening // Apply the relevant transitions to each fragment newFragment.setSharedElementEnterTransition(transitionMove); newFragment.setEnterTransition(transitionFade); newFragment.setExitTransition(transitionFade); mCurrentFragment.setExitTransition(transitionFade); mCurrentFragment.setReenterTransition(transitionFade); mCurrentFragment.setSharedElementReturnTransition(transitionMove); } fragmentTransaction.commit(); }
- He intentado jugar con permitir / no permitir superposición de transición en Enter / Return.
- He intentado jugar con los varios métodos de la configuración de la transición para los fragmentos.
- He leído a través de un montón de blogs y SO preguntas sobre este tema.
Encontré http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html blog sobre este tema, y el código de ejemplo de brockoli muy útil, pero no he podido resolver el problema.
Tal vez es un problema con mi comprensión de lo que cada transición es para?
Así es como lo entiendo.
Mi mCurrentFragment
y newFragment
tienen 5 diferentes tipos de transición cada uno:
-
setSharedElementEnterTransition
Establece la transición que se utilizará para los elementos compartidos transferidos a la Scene de contenido. -
setSharedElementReturnTransition
Establece la transición que se utilizará para los elementos compartidos transferidos de nuevo durante un pop de la pila trasera . -
setEnterTransition
Establece la transición que se utilizará para mover vistas a la escena inicial. -
setExitTransition
Establece la transición que se utilizará para mover las vistas fuera de la escena cuando el fragmento se quita, se oculta o se separa cuando no se abre la pila trasera . -
setReenterTransition
Establece la transición que se utilizará para mover las vistas a la escena cuando se devuelve debido a un estallido de una pila trasera .
Cuando se llama a mi método setFragment
, se reproduce una animación newFragment
la transición de mCurrentFragment
a newFragment
con las propiedades siguientes:
- El
newFragment
SharedElementEnterTransition define cómo los elementos compartidos pasarán anewFragment
.
(En mi caso, el ícono del CardView se expande y se mueve uno de los TextView que contiene) - El
newFragment
EnterTransition define cómo las vistas secundarias denewFragment
restantes que no son elementos compartidos pasarán a la pantalla.
(En mi caso, una barra de herramientas se desvanece en la parte inferior de la pantalla.En realidad, la barra de herramientas se está desvaneciendo detrás de la salida de RecyclerView.Hay alguna manera de cambiarlo por lo que está en frente? - MCurrentFragment ExitTransition define cómo las vistas secundarias de
mCurrentFragment
que no son elementos compartidos se transitarán fuera de la pantalla.
(En mi casomCurrentFragment
sólo contiene el RecyclerView, por lo que el efecto es que el resto de los elementos RecyclerView desaparecen en el fondo)
Cuando se hace estallar el BackStack espero que ocurra lo siguiente:
- La SharedElementReturnTransition para
mCurrentFragment
define cómo los elementos compartidos volverán a convertirse enmCurrentFragment
.
(En mi caso, los contratos de CardView regresan al tamaño del elemento RecyclerView y el TextView que contiene se mueve hacia atrás). - La ExitTransition para
newFragment
define cómo las vistas secundariasnewFragment
que no son elementos compartidos cambiarán de la pantalla.
(En mi caso, la barra de herramientas inferior se desvanece) - La ReenterTransition para
mCurrentFragment
define cómo las vistas secundariasmCurrentFragment
restantes que no son elementos compartidos volverán a la pantalla.
(En mi caso, los otros elementos de RecyclerView deben volver a aparecer, pero esto no ocurre, se ven al instante detrás de los elementos compartidos de transición).
¿He entendido mal algo?