Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Transición de elementos compartidos: actividad en fragmento anidado en otra actividad

Estoy tratando de añadir la transición de 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 la vista de pantalla completa.

Esto funciona bien si la vista compartida está alojada directamente dentro del diseño de la actividad de destino. Funciona suavemente para la animación de entrada / salida. Pero cuando estoy tratando de lograr un efecto similar en el fragmento que está anidado en la actividad objetivo este enfoque no funciona . Lo curioso es que la animación de entrar no se muestra, pero la animación de salida está funcionando bien.

Otra jerarquía de vista aún más complicada es que si la vista de destino (ImageView) está alojada en el buscapersonas de vista alojado en el diseño de trama de la actividad de destino.

¿Alguien tenía el mismo problema?

Editar: Mi código de escucha de clics

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); } } } 

One Solution collect form web for “Transición de elementos compartidos: actividad en fragmento anidado en otra actividad”

La forma en que el trabajo de transiciones requiere que la nueva Actividad sea creada, medida y establecida antes de que cualquier animación pueda ocurrir. Eso es para que pueda encontrar la vista que desea animar y crear la animación adecuada.

En su caso esto no está ocurriendo porque, como se indica en los documentos , todo FragmentTransaction.commit () hace es programar el trabajo para ser hecho. No sucede inmediatamente. Por lo tanto, cuando el marco crea su actividad no puede encontrar la vista que desea animar. Es por eso que no ves una animación de entrada pero sí ves una animación de salida. La vista está allí cuando salga de la actividad.

La solución es bastante simple. En primer lugar, puede intentar FragmentManager.executePendingTransactions () . Eso todavía podría no ser suficiente. El marco de transiciones tiene otra solución:

En el onCreate de actividad postponeEnterTransition () . Esto le dice al framework que espere hasta que le diga que es seguro crear la animación. Eso significa que usted necesita decirle que su seguro (a través de la llamada startPostponedEnterTransition () ) en algún momento. En su caso que probablemente estaría en el fragmento onCreateView.

He aquí un ejemplo de cómo podría verse:

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 posts detallados sobre el marco de Transitions .

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