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


La transición de elementos compartidos no tiene el comportamiento esperado

Implementé la transición de elemento compartido entre una imagen en un RecyclerView a una imagen en un nuevo Fragmento. El RecyclerView está alojado en un fragmento hospedado por una Actividad y el fragmento de destino está alojado dentro de otra Actividad.

Cuando hago clic en mi imagen, la transición está sucediendo como esperaba y llego a mi fragmento. Pero cuando hago clic en el botón Atrás, la transición está intentando poner mi imagen en la primera posición de mi RecyclerView mientras está mostrando la imagen que no es necesariamente la primera.

A partir de esta situación, pensé que ya que es una lista de imagen en la que se establece un nombre de transición dentro del XML, tal vez al volver, ya que toda la imagen tiene el mismo nombre de transición, el proceso es confuso y acaba de obtener la primera imagen con el dado nombre. Así que tal vez debería dar dinámicamente un nombre de transición diferente a cada uno de ellos. También establezco el mismo nombre en la imagen de destino y la restablezo cada vez que se selecciona una nueva imagen. Pero todavía no funciona. ¿Puede alguien ayudarme con eso?

Aquí está el código dentro de mi onItemClickListener:

mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){ @Override public void onItemClick(View view, int position) { final RssItem item = mAdapter.getItem(position); final RssElementIntent intent = new RssElementIntent(getActivity(), item, position); // mRootView is the view of the fragment final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image); image.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + position); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( getActivity(), image, RssElementFragment.EXTRA_IMAGE); ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); } }); 

Aquí está el código en el fragmento de destino:

 rssImage.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + getArguments().getInt(ARG_ELEMENT_POSITION)); ViewCompat.setTransitionName(rssImage, EXTRA_IMAGE); 

Y aquí está el themes.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/theme_primary</item> <item name="colorPrimaryDark">@color/theme_primary_dark</item> <item name="android:colorAccent">@color/theme_accent</item> <!-- enable window content transitions --> <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> <item name="android:windowAllowReturnTransitionOverlap">true</item> <!-- specify shared element transitions --> <item name="android:windowSharedElementEnterTransition"> @transition/change_image_transform </item> <item name="android:windowSharedElementExitTransition"> @transition/change_image_transform </item> </style> 

Editar:

Encontré mi error, estaba recibiendo ImageView del fragmento rootView que me estaba dando un ImageView aleatorio de mi RecyclerView, que significaba el nombre de transición incorrecto. Así que utilicé la vista dada por onItemClick y funcionó! También muevo el setTransitionName() dentro del adaptador.

 mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){ @Override public void onItemClick(View view, int position) { final RssItem item = mAdapter.getItem(position); final RssElementIntent intent = new RssElementIntent(getActivity(), item, position); // WRONG ! // final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image); // Correct final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( getActivity(), image, RssElementFragment.EXTRA_IMAGE); ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); } }); 

One Solution collect form web for “La transición de elementos compartidos no tiene el comportamiento esperado”

Encontré mi error, estaba recibiendo ImageView del fragmento rootView que me estaba dando un ImageView aleatorio de mi RecyclerView, que significaba el nombre de transición incorrecto. Así que utilicé la vista dada por onItemClick y funcionó! También muevo el setTransitionName () dentro del adaptador.

 mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){ @Override public void onItemClick(View view, int position) { final RssItem item = mAdapter.getItem(position); final RssElementIntent intent = new RssElementIntent(getActivity(), item, position); // WRONG ! // final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image); // Correct final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( getActivity(), image, RssElementFragment.EXTRA_IMAGE); ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.