android - studio - pasar de un fragment a otro con boton
TransiciĆ³n de elementos compartidos: actividad en fragmento anidado en otra actividad (1)
Estoy tratando de agregar la transición del elemento compartido en mi aplicación.
El escenario es que el usuario hace clic en la miniatura de la imagen que abre otra actividad con vista de imagen a pantalla completa.
Esto funciona bien si la vista compartida se hospeda directamente dentro del diseño de la actividad objetivo. Funciona sin problemas para entrar / salir de animación. Pero cuando estoy tratando de lograr un efecto similar dentro del fragmento que está anidado en la actividad objetivo, este enfoque no funciona . Lo curioso es que la animación de entrada no se muestra, pero la animación de salida funciona bien.
Otra jerarquía de vistas aún más complicada es que si la vista de destino (ImageView) está alojada dentro del paginador de vista que está alojado en el diseño de marco de la actividad de destino.
¿Alguien tuvo el mismo problema?
Editar: Mi código de escucha de clic
public class OnClickPicture extends OnClickBase {
private ObjectPicture object;
public OnClickPicture(Activity_Parent activity, ObjectPicture object) {
super(activity);
this.object = object;
}
public void onClick(View v) {
picasso.load(object.getFullUrl()).fetch();
Intent intent = new Intent(activity, ActivityPicture.class);
intent.putExtra("picture_object", helper.gson.toJson(object));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && v != null) {
Pair<View, String> p1 = Pair.create(v, "image");
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, p1);
activity.startActivity(intent, options.toBundle());
} else {
activity.startActivity(intent);
}
}
}
La forma en que funcionan las transiciones requiere que la nueva Actividad se cree, se mida y se establezca antes de que pueda ocurrir cualquier animación. Eso es para que pueda encontrar la vista que desea animar y crear la animación apropiada.
En su caso, esto no está sucediendo porque, como se indica en los documentos , todo lo que FragmentTransaction.commit () hace es programar el trabajo a realizar. No sucede de inmediato. Por lo tanto, cuando el marco crea su Actividad, no puede encontrar la vista que desea animar. Es por eso que no ve una animación de entrada pero sí ve una animación de salida. La vista está ahí cuando dejas la actividad.
La solución es bastante simple. En primer lugar, puedes probar FragmentManager.executePendingTransactions() . Eso aún podría no ser suficiente. El marco de transiciones tiene otra solución:
En el onCreate of Activity postponeEnterTransition() . Esto le dice al marco que espere hasta que le digas que es seguro crear la animación. Eso significa que debe decirle que es seguro (a través de la llamada a startPostponedEnterTransition() ) en algún momento. En su caso, eso probablemente estaría en los Fragmentos onCreateView.
Aquí hay un ejemplo de cómo podría verse eso:
Actividad B
@Override
protected void onCreate(Bundle savedInstanceState) {
// etc
postponeEnterTransition();
}
Fragmento B
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View sharedView = root.findViewById(R.id.shared_view);
sharedview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
sharedview.getViewTreeObserver().removeOnPreDrawListener(this);
getActivity().startPostponedEnterTransition();
return true;
}
});
}
Gracias a Alex Lockwood por sus detalladas publicaciones en el blog sobre el marco Transitions .