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:

  1. setSharedElementEnterTransition Establece la transición que se utilizará para los elementos compartidos transferidos a la Scene de contenido.
  2. setSharedElementReturnTransition Establece la transición que se utilizará para los elementos compartidos transferidos de nuevo durante un pop de la pila trasera .
  3. setEnterTransition Establece la transición que se utilizará para mover vistas a la escena inicial.
  4. 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 .
  5. 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 a newFragment .
    (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 de newFragment 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 caso mCurrentFragment 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 en mCurrentFragment .
    (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 secundarias newFragment 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 secundarias mCurrentFragment 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?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.