共享项目转换不在片段背面工作

时间:2016-05-08 13:25:53

标签: android android-fragments transitions

我正在使用Fragment Navigation Pattern(一个包含许多片段的活动)的Android应用上工作。我已按照this guide设法实施了共享项目转换,但只能继续工作,而不是回击。

My Fragment(称为UserFragment)由一个ViewPager和另外3个使用RecyclerViews的片段组成。单击RecyclerViews中的任何项目将打开具有相同视图的另一个UserFragment。切换到新片段时,过渡效果非常好,但我关闭它时无法使其工作。回击时,片段会淡出,前一个片段会淡入。

TL; DR:

  • 有问题的共享元素是顶部的圆形图像视图
  • transitionName个人资料
  • SharedItemTransition是一个扩展TransitionSet
  • 的自定义类
  • 我通过包含用户ID,列表类型和位置索引(并且如果它们不是唯一的,它们也不会在前进中工作)给每个recyclerview中的每个项目唯一的转换名称)

这是 RecyclerView适配器的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();
}

这就是它的样子:

Screenshot

1 个答案:

答案 0 :(得分: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,则必须推迟动画直到列表被填充并渲染视图。这篇非常有用的文章❤️Fragment Transitions by Chris Banes