android - 共享项目转换在背面的 fragment 中不起作用

标签 android android-fragments transitions

我正在开发一个带有 Fragment Navigation Pattern 的 Android 应用程序。 (一个包含许多 fragment 的 Activity )。我已经成功地按照 this guide 实现了共享项转换。但他们只在前进,而不是在回击。

我的 fragment (称为 UserFragment )由 ViewPager 组成还有 3 个带有 RecyclerViews 的 fragment 。单击 RecyclerViews 中的任何项目会打开另一个 UserFragment有相同的看法。切换到新 fragment 时过渡效果很好,但是 关闭它时我无法让它工作 .当回击时, fragment 只是淡出,前一个 fragment 淡入。

TL;博士:

  • 有问题的共享元素是顶部的圆形 ImageView
  • transitionName是个人资料
  • SharedItemTransition是扩展 TransitionSet 的自定义类
  • 我已经为每个 recyclerview 中的每个项目提供了唯一的转换名称,包括它们的用户 ID、列表类型和位置索引(如果它们不是唯一的,它也不会继续工作)


  • 这是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();
    }
    

    这是它的样子:

    Screenshot

    最佳答案

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

    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/

    相关文章:

    android - 在末尾添加 listView 和 imageView

    java - 从 mysql db 在 android map 上显示点

    android - 在使用 Intent.ACTION_GET_CONTENT 的 startActivityForResult() 之后未调用 onActivityResult()

    android - fragment Activity : Cannot cast from Fragment to derived class

    CSS3 过渡帮助

    java - Eclipse - Android 应用程序在启动时崩溃?

    android - 在 fragment 中添加可扩展列表

    qt - 根据内容的变化从 QWizardPage 动态添加/删除 Finish

    android - 使用动画对象而不是资源 ID 覆盖挂起的过渡

    android - Intermec PR3 打印机使用 intermec SDK 从 android 应用程序打印?