共享项目转换在背面的片段中不起作用
Posted
技术标签:
【中文标题】共享项目转换在背面的片段中不起作用【英文标题】:Shared Item Transition not working in fragment on back 【发布时间】:2016-09-03 04:15:47 【问题描述】:我正在使用Fragment Navigation Pattern(一个包含许多片段的活动)开发一个 android 应用程序。我已经通过关注this guide 设法实现了共享项转换,但它们只在前进时工作,而不是在回击时工作。
我的片段(称为UserFragment
)由一个ViewPager
和另外3 个带有RecyclerViews 的片段组成。单击 RecyclerViews 中的任何项目会打开另一个具有相同视图的 UserFragment
。切换到新片段时过渡效果很好,但是关闭它时我无法让它工作。回击时,片段会简单地淡出,而前一个片段会淡入。
TL;DR:
有问题的共享元素是顶部的圆形图像视图 它的transitionName
是个人资料
SharedItemTransition
是扩展 TransitionSet
的自定义类
我已经为每个 recyclerview 中的每个项目提供了唯一的转换名称,包括它们的用户 ID、列表类型和位置索引(如果它们不是唯一的,它也将无法继续工作)
这是我的RecyclerView Adapter 的onBindViewHolder
方法:
public void onBindViewHolder(final UserViewHolder uvh, int position)
final LocUser user = users.get(position);
String transition = "user_" + user.id() + "_type_" + type + "_item_" + position + "_profile_image";
uvh.name.setText(user.name());
uvh.username.setText(user.handle());
Global.setImage(uvh.userImage, user.profileImage());
ViewCompat.setTransitionName(uvh.userImage, transitionName(position));
uvh.root.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
activity.openUserProfile(user, uvh.userImage);
);
这是我的活动方法,它调用FragmentManager
并启动动画:
public void openUserProfile(LocUser user, ImageView view)
UserProfileFragment uf = UserProfileFragment.create(user);
uf.setExitTransition(new Fade());
uf.setEnterTransition(new Fade());
uf.setSharedElementEnterTransition(new SharedItemTransition());
uf.setSharedElementReturnTransition(new SharedItemTransition());
getSupportFragmentManager()
.beginTransaction()
.addSharedElement(view, "profile")
.replace(R.id.container, uf)
.addToBackStack(null)
.commit();
这就是它的样子:
【问题讨论】:
我想我也有同样的问题,虽然我的情况更简单。我在列表片段和细节片段之间切换。共享元素转换在前进时可以正常工作,但在返回时根本不行。您是否设法弄清楚是什么原因造成的? 仍然无法解决这个问题... @GeorgeMetaxas:我也有同样的问题。 伙计们,这个问题有什么解决方案吗? @TeeTracker @shaiban 将“源”和“目标”保持在相同的“传输名称”中,即使用图像的“url”作为“源”和“目标”上的名称。从详细信息返回列表后,不要执行任何“notifyChanged”之类的功能。 【参考方案1】:我已经找到了解决这个问题的方法,下面的所有魔法:
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition()
vm.state.observe(viewLifecycleOwner, Observer
if (it == QuizListViewModel.State.Ready)
(view.parent as? ViewGroup)?.doOnPreDraw
startPostponedEnterTransition()
)
如果你的视图包含 RecyclerView,你必须推迟动画直到列表被填满并渲染视图。在这篇非常有用的帖子中了解更多信息❤️Fragment Transitions by Chris Banes
【讨论】:
以上是关于共享项目转换在背面的片段中不起作用的主要内容,如果未能解决你的问题,请参考以下文章