活动返回转换-共享元素-已销毁的活动

5

所用库: appcompat-v7:22.2.1, design:22.2.1

使用主题:

测试设备/Android版本:Nexus 6

问题:只有在“不保留活动”选项下,返回Activity会快速重绘并以预期行为淡入。

我想知道这是bug还是预期行为。 我的设置非常简单。 Activity A包含一个包含在和中的工具栏。 工具栏包含和。 单击后,Activity A启动Activity B。 我正在使用共享元素,并通过将它们作为选项传递。

我的共享元素在设备旋转后仍然完美运行。在阅读了如何使用PostPoneEnterTransition并与PreDrawListeners组合后,我成功地实现了所需的转换,即使在旋转后也是如此。我的实际活动包含一个Viewpager / TabLayout和2个以上的片段,但为了简单起见,在视频中我已经剥离了它,并查看是否有其他原因导致了这个问题。

当处理旋转和推迟进入Activity A的过渡时,我决定打开开发者选项并勾选"不保留活动"视频展示了启用该选项后应用程序的运行情况。如果你仔细观察,在返回到Activity A时,它会完全绘制并迅速隐藏,然后淡入并进行共享元素过渡。

我还在动画中排除了导航栏和状态栏,以免看到这些闪烁(重新绘制冗余)。

我的问题是:

  1. 这是一个bug,还是我错过了某些步骤以防止它发生。

  2. 为什么应用程序/转换在“不保留活动”与普通的设备旋转(销毁/重新创建)时表现不同。

  3. 通过玩弄一些谷歌应用程序,我注意到这种行为并不会发生,或者至少我没有找到。有没有一种方法可以具体检查我返回的活动是否“完全销毁”,以便我可以取消动画?或者做一些不同的事情?

如果需要,我可以包含具体内容和代码示例,但我的设置非常简单,并反映了Android文档/Stack-overflow中的大量样板示例。

1个回答

1
抱歉我本来想早点回复的。我最终做的是按照代码示例和教程重新创建了一个全新的项目中的示例。首先让它能够使用单个图像视图,然后当然添加了我的自定义布局,即浮动搜索栏。一切都如预期般工作。我回去查看了我的实际项目源代码(其中充斥着不同尝试和注释掉的代码,因为我试图调试此问题),并将其清理干净。我不能确定,但我认为可能有两个可能的问题:

“除非你做些不寻常的事情...” - 最有可能的是,由于我的调试努力和对共享元素转换框架和生命周期的不完全理解,我“曾经”做了一些不寻常的事情。

我认为发生的情况是由于视图没有被正确映射,共享元素转换失败了。我在XML中定义的转换中排除了statusBarBackground。我的statusBarBackground设置为透明,这样我就可以在扩展的抽屉布局上获得很好的叠加效果。我发现,当我尝试通过代码添加statusbarbackground作为共享元素时,该视图实际上为空,导致崩溃(NPE)。同时,我将背景颜色(而不是透明)设置为我的抽屉布局。我不能确定,但这些错误的组合可能导致了奇怪的行为。

总之,我认为这个问题应该关闭,一切都按预期工作。希望能更深入地了解如何处理透明状态栏作为共享元素的情况。
  1. 这是一个错误吗?还是我忘记了什么步骤以防止这种情况发生?

    不是。一切都按预期工作。

  2. 为什么应用程序/转换在“不保留活动”与普通设备旋转(销毁/重新创建)时表现不同?

    它没有。当一切设置正确并且您的共享元素的时间和映射正确时,“不保留活动”是一种针对配置更改测试转换的具体方法。

  3. 通过玩弄一些谷歌应用程序,我注意到这种行为并不会发生,或者至少我找不到。有没有一种方法可以明确检查我返回的活动是否“完全销毁”,以便我可以取消动画?还是做一些不同的事情?

    这是因为Google开发人员做得很对 :)。

对于任何遇到共享元素问题的人,这里有一些建议。

  1. 从小开始。首先使用单个视图,并确认在所有情况下(包括旋转和配置更改后)都能获得正确的行为,然后再添加复杂性。

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


1
你能分享一些代码展示你如何处理旋转吗? - Tim Autin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接