4

库使用:程序兼容性-V7:22.2.1,设计:使用22.2.1活动返回过渡 - 共享元素 - 杀死活性

主题:

设备/的Android版本上再现:连结6

问题:返回活动快速重绘/出现,然后以期望的行为淡入,只有"Don't keep activities alive"

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

我的共享元素即使在设备旋转后也可以很好地工作。在阅读我如何可以PostPoneEnterTransition和组合PreDrawListeners即使旋转后我也能够成功实现所需的转换。我的实际活动包含一个Viewpager/TabLayout和2+片段,但为了简单起见,我已将它剥离回视频中,并查看是否有其他内容导致此问题。

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

我也排除了动画中的导航栏和状态栏,所以我没有看到这些闪烁(重绘冗余)。

我的问题是:

  1. 这是一个错误,还是我失去了为了防止这种情况的一个步骤。

  2. 为什么应用程序/转换与"Don't keep activities alive"相比,旧式设备轮转(销毁/重新创建)的行为有所不同。

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

如果需要的话,但我的设置非常简单,反映从Android文档/堆栈溢出一堆烦人的例子我可以包括细节和代码示例。

回答

0

对不起,我打算早些时候回应。我最终做的是尽可能以代码示例和教程在全新项目中重新创建示例。首先让它使用单个图像视图,然后添加我的自定义布局,这是一个浮动搜索栏。一切按预期工作。我回过头来回顾一下我的实际项目源代码(在尝试调试这个问题时,这些源代码被不同的尝试和代码注释掉)并将其清理干净。我不能肯定地说,但我相信它来到了可能存在两个问题:

“除非你做一些不寻常的......” - 最有可能的我“是”的时候做一些不同寻常的我创造了这个问题做我的调试工作,缺乏对共享元素转换框架和生命周期的全面理解。

我觉得发生了什么事情是共享元素转换失败了做不正确的映射。我在XML中定义的转换中排除了statusBarBackground。我的statusBarBackground被设置为透明,因此对于扩展抽屉布局我有很好的叠加效果。我发现在试图通过代码将statusbarbackground作为共享元素添加时,视图实际上是空的,导致崩溃(NPE)。以及我为抽屉布局设置了背景颜色(而不是透明)。我不能肯定地说,但这些错误的组合导致了奇怪的行为。

最后,我要说的是,这个问题应该被关闭,一切都如预期运行。这将是很好的得到处理透明的状态栏为共享元素的更清楚了。

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

    No. Everything is working as intended.

  2. 为什么应用程序/转换不同的表现与“不保留活动活着”与普通的老式设备旋转(破坏/重新创建)?

    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. 我已经通过了一些谷歌应用程序玩耍注意到,此行为不会发生,或者至少我能找到。有没有办法具体检查我回来的活动是否“完全被摧毁”,这样我就可以取消动画了?或做一些不同的事情?

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

对于任何与共享的元素挣扎,这里有一些建议。

  1. 从小开始。第一次使用的单一视图,并确认你得到正确的行为,在任何情况下,即使在旋转和配置的变化,那么你就可以增加复杂性。

  2. 使用SharedElementCallback调试你的过渡。你可以检查哪些视图被映射,哪个视图失败等。

+0

你能分享一些代码,显示你如何处理旋转? –