La transición de elementos compartidos funciona con FragmentTransaction.replace () pero no funciona con FragmentTransaction.add ()

Las nuevas Transiciones de elementos compartidos funcionan cuando uso Fragmento ' reemplazar ', pero no puedo hacer que funcione el fragmento ' agregar '. Yo uso el mismo contenedor en ambos casos.

Más detalles:

Actividad – diseño->

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ffff" android:orientation="vertical" > </FrameLayout> 

Al iniciar la Actividad, agrego Fragmento1 a la pantalla

 getFragmentManager().beginTransaction().replace(R.id.container,new TransitionTestFragment1(), "TransitionTestFragment1").commit(); 

En un evento de clic para una vista en el diseño de Fragmento1 -> agrego Fragmento2 a la pantalla. Puse el oyente en el primer fragmento de onCreateView

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final TransitionSet transitionSet = new TransitionSet(); transitionSet.addTransition(new ChangeImageTransform()); transitionSet.addTransition(new ChangeBounds()); transitionSet.addTransition(new ChangeTransform()); transitionSet.setDuration(300); View v=inflater.inflate(R.layout.fragment1, null); final View image=v.findViewById(R.id.image); image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setSharedElementReturnTransition(transitionSet); Fragment fragment = new TransitionTestFragment2(); fragment.setSharedElementEnterTransition(transitionSet); FragmentTransaction ft = getFragmentManager().beginTransaction() .replace(R.id.container, fragment) .addToBackStack("transaction") .addSharedElement(image, "MyTransition"); ft.commit(); } }); return v; 

}

Tengo esta vista de imagen en los diseños de ambos fragmentos

  <ImageView android:layout_width="300dp" android:layout_height="300dp" android:src="@drawable/ic_launcher" android:transitionName="MyTransition" /> 

Ahora, la transición no funciona si uso FragmentTransaction.add() para agregar el segundo fragmento, pero funciona si utilizo FragmentTransaction.replace() lugar. ¿Cómo puedo hacer que funcione con add ()? ¿Es posible?

Supongo que es porque el nuevo fragmento se coloca en la parte superior del fragmento antiguo. El fragmento antiguo no se coloca fuera del controlador y onPause (y métodos secuenciados) no se están llamando. No reproduce ninguna transición porque el fragmento antiguo puede seguir siendo visible para el usuario (el sistema no lo sabe).

En mi respuesta (donde comentaste) añadí una transición de entrada y salida. Si lo agregas, ¿incluso anima? Si no, es probablemente debido a la razón declarada.

No se animará porque el fragmento viejo todavía está presente. Para añadir, es necesario ocultar el fragmento anterior. Aquí está el ejemplo

Para empujar:

  fragmentTransaction.add(R.id.content, fragment); if (fragments.size() > 0) { UIBaseFragment lastElement = fragments.lastElement(); fragmentTransaction.hide(lastElement); } fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); fragments.push(fragment); 

Entonces pop de esta manera

  final FragmentManager manager = getChildFragmentManager(); manager.popBackStack(); fragments.pop(); 
  • Es posible hacer la transición de elementos compartidos de fragmento a ViewPager dentro de viewpager
  • SharedElment transition usando fragmentos que no están en transición
  • Transición de elementos compartidos en CardView con radio
  • Las transiciones de elementos compartidos no funcionan cuando se combinan con un CoordinatorLayout y CollapsingToolbarLayout
  • Las transiciones de elementos compartidos pasan por la barra de navegación
  • Webview falla en la transición de elementos compartidos en lollipop
  • Uso de transiciones de actividad de SharedElement con una vista personalizada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.