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:
- Cómo saber cuándo finaliza la transición de elemento compartido
- Transición de elemento compartido de Android: la vista de héroe se dibuja delante de otro
- Transición de elementos compartidos con actividad de diálogo
- La transición de elementos compartidos no tiene el comportamiento esperado
- Fragmentos de ViewPager - Transiciones de elementos compartidos
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?
- Transición del fragmento Android con elemento compartido
- Transición de elementos compartidos de Android: transformación de un ImageView de un círculo a un rectángulo y viceversa
- Android compartió elementos "héroe" transiciones cuando se oscurece
- Transición de elemento compartido en una vista en un RecyclerView, ¿posible?
- Transición de elemento compartido (primer plano / fondo)
- Transición de actividad de elementos compartidos en android 5
- ¿Cómo puedo excluir ActionBar cuando las transiciones entre Actividades en Android 5.0
- Múltiples elementos compartidos
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();
- Error de inicio de sesión: hay un error al iniciar sesión en esta aplicación. Por favor, inténtelo de nuevo más tarde
- Android Genymotion VM logcat se ejecuta en bucle infinito