我正在开发一个带有 Fragment Navigation Pattern 的 Android 应用程序。 (一个包含许多 fragment 的 Activity )。我已经成功地按照 this guide 实现了共享项转换。但他们只在前进,而不是在回击。
我的 fragment (称为 UserFragment
)由 ViewPager
组成还有 3 个带有 RecyclerViews 的 fragment 。单击 RecyclerViews 中的任何项目会打开另一个 UserFragment
有相同的看法。切换到新 fragment 时过渡效果很好,但是 关闭它时我无法让它工作 .当回击时, fragment 只是淡出,前一个 fragment 淡入。
TL;博士:
transitionName
是个人资料SharedItemTransition
是扩展 TransitionSet
的自定义类这是
onBindViewHolder
我的方法 RecyclerView 适配器: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);
}
});
}
这是我的 Activity 方式调用
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();
}
这是它的样子:
最佳答案
我找到了解决这个问题的方法,下面的所有魔法:
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()
}
}
})
}
如果你的 View 包含 RecyclerView,你必须推迟动画直到列表被填满并渲染 View 。在这篇非常有用的帖子中了解更多信息❤️ Fragment Transitions by Chris Banes
关于android - 共享项目转换在背面的 fragment 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37100341/