当多个元素时,共享元素事务无法与 recyclerview 一起使用
shared element transaction not working with recyclerview when more than one element
android 应用程序中有一个 recyclerview,当用户转到其他片段时我想要共享元素事务,我按照下面的代码进行了尝试。
行中的图像视图 xml 文件
<ImageView
android:id="@+id/iv_album_thumbnail"
android:layout_width="match_parent"
android:layout_height="160dip"
android:layout_gravity="center"
android:transitionName="image_transit"
android:scaleType="centerCrop"
tools:ignore="ContentDescription"
android:src="@drawable/img_default"
android:gravity="center" />
第二个片段中的图像视图
<ImageView
android:id='@+id/iv_album_thumbnail'
android:layout_width="wrap_content"
android:layout_centerHorizontal="true"
android:layout_height="wrap_content"
android:transitionName="image_transit"
tools:ignore="ContentDescription,UnusedAttribute"
android:layout_marginTop="60dip"
android:layout_alignParentTop="true"
android:src="@drawable/placeholder" />
点击方法
public void onAlbumClicked(RecyclerViewAdapter.ViewHolder holder, int position) {
SongListFragment kittenDetails = SongListFragment.newInstance(aList.get(position));
// Note that we need the API version check here because the actual transition classes (e.g. Fade)
// are not in the support library and are only available in API 21+. The methods we are calling on the Fragment
// ARE available in the support library (though they don't do anything on API < 21)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
kittenDetails.setSharedElementEnterTransition(new DetailsTransition());
kittenDetails.setEnterTransition(new Fade());
setExitTransition(new Fade());
kittenDetails.setSharedElementReturnTransition(new DetailsTransition());
}
getActivity().getSupportFragmentManager()
.beginTransaction()
.addSharedElement(holder.imgPicture, "image_transit")
.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
.replace(R.id.root, kittenDetails)
.addToBackStack(null)
.commit();
}
当 recyclerview
中只有一项时,它工作完美,但是当 recyclerview
中有多个项目时,根本没有效果,谁能告诉我。
我认为问题在于您在源视图树中有多个具有相同转换名称的视图。
您应该只在点击的行上设置它:
- 从行 xml 中删除
android:transitionName
属性。
- 添加
ViewCompat.SetTransitionName(holder.imgPicture, "image_transit");
android 应用程序中有一个 recyclerview,当用户转到其他片段时我想要共享元素事务,我按照下面的代码进行了尝试。
行中的图像视图 xml 文件
<ImageView
android:id="@+id/iv_album_thumbnail"
android:layout_width="match_parent"
android:layout_height="160dip"
android:layout_gravity="center"
android:transitionName="image_transit"
android:scaleType="centerCrop"
tools:ignore="ContentDescription"
android:src="@drawable/img_default"
android:gravity="center" />
第二个片段中的图像视图
<ImageView
android:id='@+id/iv_album_thumbnail'
android:layout_width="wrap_content"
android:layout_centerHorizontal="true"
android:layout_height="wrap_content"
android:transitionName="image_transit"
tools:ignore="ContentDescription,UnusedAttribute"
android:layout_marginTop="60dip"
android:layout_alignParentTop="true"
android:src="@drawable/placeholder" />
点击方法
public void onAlbumClicked(RecyclerViewAdapter.ViewHolder holder, int position) {
SongListFragment kittenDetails = SongListFragment.newInstance(aList.get(position));
// Note that we need the API version check here because the actual transition classes (e.g. Fade)
// are not in the support library and are only available in API 21+. The methods we are calling on the Fragment
// ARE available in the support library (though they don't do anything on API < 21)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
kittenDetails.setSharedElementEnterTransition(new DetailsTransition());
kittenDetails.setEnterTransition(new Fade());
setExitTransition(new Fade());
kittenDetails.setSharedElementReturnTransition(new DetailsTransition());
}
getActivity().getSupportFragmentManager()
.beginTransaction()
.addSharedElement(holder.imgPicture, "image_transit")
.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
.replace(R.id.root, kittenDetails)
.addToBackStack(null)
.commit();
}
当 recyclerview
中只有一项时,它工作完美,但是当 recyclerview
中有多个项目时,根本没有效果,谁能告诉我。
我认为问题在于您在源视图树中有多个具有相同转换名称的视图。
您应该只在点击的行上设置它:
- 从行 xml 中删除
android:transitionName
属性。 - 添加
ViewCompat.SetTransitionName(holder.imgPicture, "image_transit");