Android棒棒糖中属于不同活动的片段之间的共享元素转换

我有一个属于一个活动的片段中的共享元素。

我想在Android Lollipop中使用属于另一个活动的片段的一部分的元素进行共享元素转换。

可能吗?

我怎样才能做到这一点?

Solutions Collecting From Web of "Android棒棒糖中属于不同活动的片段之间的共享元素转换"

这是可能的。

首先,在片段中检测到即将发生转换时,请构build一个Pair<View, String>的数组,并使用视图和转换名称填充。

例如,如果要从缩略图图像制作全宽图像的animation:

  Pair[] pairs = new Pair[1]; pairs[0] = new Pair(thumbnailImage, "THUMBNAIL_IMAGE"); 

其次,将该数组传递给fragment的活动,以便启动实际的转换。 (我正在使用Otto来传递这个事件,如果你喜欢,你可以使用普通的callback函数)。

然后,在你的活动中,开始第二个活动。 (我创build了一个简单的方法来做到这一点)

 public static void transitionExpand(Activity activity, Intent intent, Pair<View, String>[] sharedElements) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements); ActivityCompat.startActivity(activity, intent, options.toBundle()); } 

在第二个活动中,您可以按照通常的方式添加片段。 然后,在第二个片段的onViewCreated()方法中,可以调用:

 ViewCompat.setTransitionName(fullWidthImage, "THUMBNAIL_IMAGE"); 

希望能帮助到你

更新:从支持库的v25.1.1开始 ,这些相同的方法在支持碎片中。 链接到文档: Fragment.postponeEnterTransition()和Fragment.startPostponedEnterTransition()

原文答案:

即使在第二个Activity中添加了一个dynamic添加的Fragment也是可能的。

你只需要告诉第二个Activity不要运行它的Transitionanimation,直到共享元素被布置和测量。

在第二个Activity的onCreate调用postponeEnterTransition() (或supportPostponeEnterTransition()如果您正在使用支持库)。 dynamic添加您的片段到这个活动。 在dynamic添加的Fragment中的onCreateView方法结束时,调用getActivity().startPostponedEnterTransition()

这当然假设你已经完成了共享元素转换所需的所有其他function,但是我相信这些方法就是你用你的问题来search的东西。

感谢@ alex-lockwood的博客给我看光。