android - fragments - la transición de elementos compartidos funciona con FragmentTransaction.replace() pero no funciona con FragmentTransaction.add()
overridependingtransition fragment (3)
No se animará porque el fragmento antiguo todavía está presente. Para agregar necesitas esconder 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();
Las nuevas Transiciones de elementos compartidos funcionan cuando uso el fragmento '' reemplazar '' pero parece que no puedo hacer que funcione el fragmento '' agregar ''. Yo uso el mismo envase 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 lanzamiento de la Actividad, agrego Fragment1 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 Fragment1 -> agrego Fragment2 a la pantalla. Puse al oyente en el primer Fragmento 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 uso FragmentTransaction.replace()
lugar. ¿Cómo puedo hacer que funcione con add ()? ¿Es posible en absoluto?
Sé que esta es una pregunta antigua, pero recientemente tuve el mismo problema: .replace no era una opción.
Tuve que usar .Ocultar y .Add y lo que funcionó para mí fue establecer:
setReorderingAllowed(true)
en la transacción
Supongo que es porque el nuevo fragmento se coloca encima del fragmento anterior. El fragmento antiguo no se está colocando fuera del controlador y no se está llamando onPause
(y los métodos en secuencia). No reproduce ninguna transición porque el fragmento anterior aún puede ser visible para el usuario (el sistema no lo sabe).
En mi answer (donde comentaste) agregué una transición de entrada y salida. Si lo añades, ¿incluso anima? Si no es así, es probable que sea por la razón declarada.