在返回时,片段中的共享元素转换未能正常工作

11

我正在开发一个使用 Fragment 导航模式(一个 Activity 包含多个 Fragment)的 Android 应用。我按照这个指南成功实现了共享元素过渡效果,但是这只能够在前进时工作,返回时无法正常工作。

我的 Fragment(名为 UserFragment)由一个带有 3 个包含 RecyclerView 的 Fragment 的 ViewPager 组成。单击 RecyclerView 中的任何项都会打开另一个具有相同视图的 UserFragment。当切换到新的 Fragment 时,过渡效果完美地工作,但是当关闭它时,我无法让它正常工作。在点击后退按钮时,该 Fragment 会简单地淡出并且前一个 Fragment 淡入。

简短概括:

  • 所涉及的共享元素是顶部的圆形图片视图
  • transitionNameprofile
  • SharedItemTransition 是一个扩展了 TransitionSet 的自定义类
  • 我为每个 RecyclerView 中的每个项都设置了唯一的过渡名称,包括它们的用户 ID、列表类型和位置索引(如果它们不是唯一的,则前进时也无法工作)

这是我 RecyclerView AdapteronBindViewHolder 方法:

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();
}
这是它的外观:

Screenshot


2
我认为我有完全相同的问题,尽管我的情况甚至更简单。我在列表片段和详细信息片段之间切换。共享元素转换在前进时正常工作,但返回时根本不起作用。你已经找出是什么原因了吗? - gmetal
各位,这个问题有什么解决方案吗?@TeeTracker - shaiban
@shaiban,请将“source”和“target”保持在同一个“transit-name”中,即使用图像的“url”作为“source”和“taget”的名称。在从详细信息返回列表后,请不要执行任何“notifiyChanged”等函数。 - TeeTracker
@TeeTracker:我也尝试过这种方法,但仍然没有结果。我的场景是有一个viewpager,上面放置了主fragment,而viewpager又包含3个其他的fragment。现在,从其中一个fragment(由viewpager托管)导航到另一个新的fragment时,共享转换是正常的,但是返回时却不行。请帮忙解决! - shaiban
你能解决这个问题吗? - User
显示剩余2条评论
1个回答

0

我已经找到了解决这个问题的方法,所有的魔法如下:

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,你必须推迟动画直到列表填充并且视图渲染完成。更多关于此的信息可以在这篇非常有帮助的文章中找到 ❤️ Chris Banes的Fragment转换


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接