使用的库:appcompat-v7:22.2.1,设计:22.2.1
使用的主题:
设备/ Android版本转载于:Nexus 6
问题:返回活动会快速重绘/显示,然后以所需行为淡入,只有"Don't keep activities alive"
。
我想知道这是一个错误还是预期的行为。我有一个非常简单的设置。活动A包含一个包含在AppbarLayout
和CoorindinatorLayout
中的工具栏。工具栏包含Cardview
和TextView
。点击TextView
后,活动A启动活动B.我使用共享元素并通过ActivityCompat.StartActivity(bundle, options);
即使在设备旋转后,我的共享元素也能完美运行。在阅读了我如何PostPoneEnterTransition
并与PreDrawListeners
进行组合之后,即使在轮换之后,我也能够成功实现所需的转换。我的实际活动包含Viewpager
/ TabLayout
和2 +个片段,但为了简单起见,我已将其删回视频中,以及查看是否有其他因素导致此问题。< / p>
在处理轮换并将输入转换推迟回活动A时,我决定打开开发人员选项并检查"Don't keep activities alive"
。 video描述了在启用该选项的情况下运行的应用。如果仔细观察,可以看到返回活动A后,它会被很快地完全绘制和隐藏,然后发生淡入淡出以及共享元素转换。
我还排除了动画中的导航栏和状态栏,这样我就不会看到那些闪烁(冗余地重绘)。
我的问题是:
这是一个错误,还是我错过了一个步骤以防止这种情况发生。
为什么app / transitions在"Don't keep activities alive"
与普通旧设备轮换(销毁/重新创建)的行为方式不同。
我通过玩一些谷歌应用程序注意到,这种行为不会发生,或者至少我能找到。有没有办法具体检查我回来的活动是否完全被毁坏了#34;所以我可以取消动画?或者做些不同的事情?
如果需要,我可以包含细节和代码示例,但我的设置非常简单,并且反映了Android文档/ Stack-overflow中的一堆样板示例。
答案 0 :(得分:1)
抱歉,我打算早些回复。我最终做的是在一个完全新鲜的项目中重新创建示例,尽可能地遵循代码示例和教程。首先使用单个图像视图,然后添加我的自定义布局,这是一个浮动搜索栏。一切都按预期工作。我回过头来查看了我的实际项目源(在尝试调试此问题时,尝试了不同的尝试并注释掉了代码)并清理了它。我无法肯定地说,但我认为它归结为两个可能的问题:
&#34;除非你做一些与众不同的事情......&#34; - 我很可能是&#34;&#34;在我创建此问题时做一些不寻常的事情对我的调试工作做了很多,并且缺乏对共享元素转换框架和生命周期的全面理解。
我认为发生的事情是共享元素转换未能正确映射视图。我在XML中定义的转换中排除了statusBarBackground。我的statusBarBackground设置为透明,这样我就可以为扩展的抽屉布局提供漂亮的叠加效果。我发现在尝试通过代码将statusbarbackground添加为共享元素时,视图实际上为null,从而导致崩溃(NPE)。我已经为抽屉布局设置了背景颜色(而不是透明)。我无法肯定地说,但这些错误的组合会导致奇怪的行为。
总而言之,我想说这个问题应该关闭,一切都按预期工作。如果能够更好地了解如何将透明状态栏作为共享元素处理,那将会很有用。
这是一个错误,还是我错过了一步以防止这种情况?
No. Everything is working as intended.
为什么应用程序/转换的行为方式不同于&#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.
我通过玩一些谷歌应用程序注意到,这种行为不会发生,或者至少我能找到。有没有办法具体检查我回来的活动是否完全被毁坏了#34;所以我可以取消动画?或者做些不同的事情?
This is because the Google dev's did it right :)
对于任何挣扎着共享元素的人来说,这里有一些建议。
从小处开始。首先使用单个视图并确认您在所有情况下都获得了正确的行为,即使在轮换和配置更改之后,您也可以增加复杂性。
使用SharedElementCallback调试转换。您可以检查映射的视图,哪个视图失败等。