共享项目转换在背面的片段中不起作用

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

【讨论】:

以上是关于共享项目转换在背面的片段中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

共享元素片段转换不起作用

共享转换片段到片段不起作用

当透视应用于父元素时,为啥隐藏的背面可见性在 IE10 中不起作用?

invalidateOptionsMenu在片段中不起作用

Onclicklistener 在片段列表视图中不起作用

onRequestPermissionsResult 在片段中不起作用