活动回报转换 - 共享元素 - 已杀死的活动

时间:2015-08-18 00:22:30

标签: android animation android-support-library android-design-library

使用的库:appcompat-v7:22.2.1,设计:22.2.1

使用的主题:

设备/ Android版本转载于:Nexus 6

问题:返回活动会快速重绘/显示,然后以所需行为淡入,只有"Don't keep activities alive"

我想知道这是一个错误还是预期的行为。我有一个非常简单的设置。活动A包含一个包含在AppbarLayoutCoorindinatorLayout中的工具栏。工具栏包含CardviewTextView。点击TextView后,活动A启动活动B.我使用共享元素并通过ActivityCompat.StartActivity(bundle, options);

将其作为选项传递

即使在设备旋转后,我的共享元素也能完美运行。在阅读了我如何PostPoneEnterTransition并与PreDrawListeners进行组合之后,即使在轮换之后,我也能够成功实现所需的转换。我的实际活动包含Viewpager / TabLayout和2 +个片段,但为了简单起见,我已将其删回视频中,以及查看是否有其他因素导致此问题。< / p>

在处理轮换并将输入转换推迟回活动A时,我决定打开开发人员选项并检查"Don't keep activities alive"video描述了在启用该选项的情况下运行的应用。如果仔细观察,可以看到返回活动A后,它会被很快地完全绘制和隐藏,然后发生淡入淡出以及共享元素转换。

我还排除了动画中的导航栏和状态栏,这样我就不会看到那些闪烁(冗余地重绘)。

我的问题是:

  1. 这是一个错误,还是我错过了一个步骤以防止这种情况发生。

  2. 为什么app / transitions在"Don't keep activities alive"与普通旧设备轮换(销毁/重新创建)的行为方式不同。

  3. 我通过玩一些谷歌应用程序注意到,这种行为不会发生,或者至少我能找到。有没有办法具体检查我回来的活动是否完全被毁坏了#34;所以我可以取消动画?或者做些不同的事情?

  4. 如果需要,我可以包含细节和代码示例,但我的设置非常简单,并且反映了Android文档/ Stack-overflow中的一堆样板示例。

1 个答案:

答案 0 :(得分:1)

抱歉,我打算早些回复。我最终做的是在一个完全新鲜的项目中重新创建示例,尽可能地遵循代码示例和教程。首先使用单个图像视图,然后添加我的自定义布局,这是一个浮动搜索栏。一切都按预期工作。我回过头来查看了我的实际项目源(在尝试调试此问题时,尝试了不同的尝试并注释掉了代码)并清理了它。我无法肯定地说,但我认为它归结为两个可能的问题:

&#34;除非你做一些与众不同的事情......&#34; - 我很可能是&#34;&#34;在我创建此问题时做一些不寻常的事情对我的调试工作做了很多,并且缺乏对共享元素转换框架和生命周期的全面理解。

我认为发生的事情是共享元素转换未能正确映射视图。我在XML中定义的转换中排除了statusBarBackground。我的statusBarBackground设置为透明,这样我就可以为扩展的抽屉布局提供漂亮的叠加效果。我发现在尝试通过代码将statusbarbackground添加为共享元素时,视图实际上为null,从而导致崩溃(NPE)。我已经为抽屉布局设置了背景颜色(而不是透明)。我无法肯定地说,但这些错误的组合会导致奇怪的行为。

总而言之,我想说这个问题应该关闭,一切都按预期工作。如果能够更好地了解如何将透明状态栏作为共享元素处理,那将会很有用。

  1. 这是一个错误,还是我错过了一步以防止这种情况?

    No. Everything is working as intended.

  2. 为什么应用程序/转换的行为方式不同于&#34;不要让活动保持活跃状态​​&#34; vs普通的旧设备轮换(销毁/重新创建)?

    It doesn't. When everything is setup proper and your timing and mapping of shared elements is correct, "Don't keep activities alive" is a concrete way to test your transitions against configuration changes.

  3. 我通过玩一些谷歌应用程序注意到,这种行为不会发生,或者至少我能找到。有没有办法具体检查我回来的活动是否完全被毁坏了#34;所以我可以取消动画?或者做些不同的事情?

    This is because the Google dev's did it right :)

  4. 对于任何挣扎着共享元素的人来说,这里有一些建议。

    1. 从小处开始。首先使用单个视图并确认您在所有情况下都获得了正确的行为,即使在轮换和配置更改之后,您也可以增加复杂性。

    2. 使用SharedElementCallback调试转换。您可以检查映射的视图,哪个视图失败等。