0

我明白,有活性的过渡,使转变为像这样活性的和活动B之间共享的元素:Android:如果其中一个共享元素位于Fragment中,是否有办法执行活动转换?酶活性的片段到活动乙

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, 
    Pair.create(view1, "agreedName1"), 
    Pair.create(view2, "agreedName2")); 

还有片段转换为处于相同的活性的片段。但是有没有办法在活动A的片段视图和活动B之间转换共享元素?

我的活动A有一个ViewPager与碎片,有意见,我想过渡到活动B的意见。所以我想转换到Activity B的视图实际上在Activity A的Fragment布局中,而不是直接在Activity A的布局中。

有什么办法可以使这项工作?

回答

3

是的,片段本身不会导致活动转换问题。主要问题是碎片往往会在稍后加载其内容,并且过渡系统会对可用内容感到困惑。

当存在转换时,视图实际上不会从一个活动移动到另一个活动。有一个快照拍摄了位置和大小(以及位图),并且该信息被传送到活动B中。活动B中的相应视图然后从该位置和大小转换到最终位置和大小。通常不使用位图,但在需要交叉淡入淡出或类似情况时可以使用。

如果共享元素位于活动A中的片段中,则传出过渡很好 - 视图存在且位置正确。唯一的潜在问题是回归过渡。当活动B关闭时,活动A可能需要重新启动(内存压力,方向更改等)。在这种情况下,必须重新创建片段,并正确放置View。在onActivityReenter中,调用postponeEnterTransition,然后在片段加载并且布局完成时,调用startPostponedEnterTransition。然后活动B将知道共享元素的最终位置和大小,因此它可以开始其动画。

反过来也是如此,当Activity B在片段中有共享元素时。您必须延迟onCreate中的输入转换,直到在活动B中加载了片段并完成布局之后。

+0

感谢有关生命周期并发症的解释,George。你碰巧知道片段加载完成后片段的正确回调是什么?我相信Fragment的某种onAttach方法类似于View的onAttachToWindow,所以我现在的计划是像你说的那样等待postponeEnterTransition中的回调。 –

+0

在收到'onCreateView'后,应该加载片段的视图,但过渡不应该开始。您需要等到布局完成后才能开始转换,这意味着您应该在'onCreateView'中添加一个'OnPreDrawListener'。请记住在通知后删除“OnPreDrawListener”,因为它们不是一次性侦听器。 –

+0

嘿乔治,你是说在片段中的onCreateView或活动的onCreateView上添加onPreDrawListener(根据我的理解,这不是Activity的生命周期的一部分)?因为startPostponedEnterTransition是一个Activity方法。 –

0

我不知道这是否会帮助你,但我做了这样的事情。

ActivityOptionsCompat options = ActivityOptionsCompat 
         .makeSceneTransitionAnimation(getActivity(), 
           (View) viewHolder.clickme, "zoom"); 
       getActivity().startActivity(i, options.toBundle()); 
       getActivity().overridePendingTransition(R.anim.fadein, 
         R.anim.fadeout); 

我希望它能以某种方式帮助你。