片段之间的共享元素转换

Posted

技术标签:

【中文标题】片段之间的共享元素转换【英文标题】:Shared Element transition between fragments 【发布时间】:2015-05-15 08:29:36 【问题描述】:

我正在尝试创建一个类似于播放音乐的共享元素过渡元素。当您单击卡片时,专辑封面会展开到新片段中的 ImageView。然后,当您单击返回时,它会动画回到卡片中。我的进入动画运行良好,但问题是返回或退出过渡。每当我回到上一个片段时,应用程序就会崩溃。这是我得到的错误:

java.lang.NullPointerException:尝试调用虚拟方法 '布尔值 android.support.v4.app.Fragment.getAllowReturnTransitionOverlap()' 开启 空对象引用

这是我执行动画/过渡的方式:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
                fragment.setSharedElementReturnTransition(TransitionInflater.from(fragment.getActivity()).inflateTransition(R.transition.change_image_transform));
                fragment.setReturnTransition(TransitionInflater.from(fragment.getActivity()).inflateTransition(android.R.transition.explode));

                Fragment replaceFragment = new AlbumPageFragment();
                replaceFragment.setSharedElementEnterTransition(TransitionInflater.from(fragment.getActivity()).inflateTransition(R.transition.change_image_transform));
                replaceFragment.setEnterTransition(TransitionInflater.from(fragment.getActivity()).inflateTransition(android.R.transition.explode));


                ImageView image = (ImageView) layout.findViewById(R.id.album_card_album_art);


                FragmentTransaction ft = fragment.getFragmentManager().beginTransaction()
                        .replace(R.id.content_frame, replaceFragment)
                        .addToBackStack("transaction")
                        .addSharedElement(image, "MyTransition");
                ft.commit();
            

change_image_transform.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeImageTransform />
</transitionSet>

content_frame 位于 Activity 的布局视图中,因此两个片段都包含在其中。

我的问题是:如何正确使用片段的共享元素转换?谢谢!

【问题讨论】:

另外,您可能想在片段的onCreate() 方法中调用setEnterTransition()setSharedElementEnterTransition() 等,而不是在提交FragmentTransaction 之前。否则,如果片段被破坏(例如由于方向变化),这些转换将被遗忘。 您应该在 replaceFragment 上设置返回过渡,而不是在片段上。 【参考方案1】:

答案可能是这样的

        replaceFragment.setSharedElementEnterTransition(transition);
        replaceFragment.setSharedElementReturnTransition(transition);

【讨论】:

以上是关于片段之间的共享元素转换的主要内容,如果未能解决你的问题,请参考以下文章

跨活动的片段之间的共享元素转换不一致

片段之间的共享元素转换

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

视图之间的共享元素转换(不是活动或片段)

带有共享元素的 Android 片段转换

片段转换:共享元素