EnterTransitionCoordinator导致Android 5.0中的NPE

时间:2016-01-07 15:26:22

标签: android android-transitions

添加退出并输入活动转换到应用程序后,我收到崩溃报告,如下所示:

  

致命异常:java.lang.NullPointerException:尝试调用   虚方法'android.view.ViewParent android.view.View.getParent()'   在null对象引用上          在android.view.ViewOverlay $ OverlayViewGroup.add(ViewOverlay.java:164)          在android.view.ViewGroupOverlay.add(ViewGroupOverlay.java:63)          在android.app.EnterTransitionCoordinator.startRejectedAnimations(EnterTransitionCoordinator.java:598)          在android.app.EnterTransitionCoordinator.startSharedElementTransition(EnterTransitionCoordinator.java:325)          在android.app.EnterTransitionCoordinator.access $ 200(EnterTransitionCoordinator.java:42)          在android.app.EnterTransitionCoordinator $ 5 $ 1.run(EnterTransitionCoordinator.java:389)          在android.app.ActivityTransitionCoordinator.startTransition(ActivityTransitionCoordinator.java:698)          在android.app.EnterTransitionCoordinator $ 5.onPreDraw(EnterTransitionCoordinator.java:386)          在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)          在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1985)          在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077)          在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5845)          在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767)          在android.view.Choreographer.doCallbacks(Choreographer.java:580)          在android.view.Choreographer.doFrame(Choreographer.java:550)          在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)          在android.os.Handler.handleCallback(Handler.java:739)          在android.os.Handler.dispatchMessage(Handler.java:95)          在android.os.Looper.loop(Looper.java:135)          在android.app.ActivityThread.main(ActivityThread.java:5272)          在java.lang.reflect.Method.invoke(Method.java)          在java.lang.reflect.Method.invoke(Method.java:372)          在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:909)          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

它不可重复,但崩溃计数很重要。

做了一些研究,我发现这个提交表明它(实际上)是Android中的一个内部错误: https://android.googlesource.com/platform/frameworks/base/+/83c692efd3c53050fce132dfd2ef21763d3cf010%5E%21/#F0

所有崩溃报告都是5.0,5.0.1或5.0.2。因为5.1有更广泛的传播,但没有显示崩溃,似乎EnterTransitionCoordinator在5.1中被修复。

因此,一种可能的解决方案是检查API级别22或更高级别,然后只进行转换。不过我想知道是否有更好的方法;一些解决方法可能,尽管这似乎是Android的内部问题(堆栈中的所有系统类)?

3 个答案:

答案 0 :(得分:7)

在要求API级别22(Android 5.1)进行转换后,崩溃消失了。所以这是最简单的解决方案。如果您需要使用Android 5.0支持此功能,请查看Nikola的答案(我们不会自行尝试以避免使用其他代码)。

答案 1 :(得分:5)

此Android操作系统错误与共享元素转换期间“被拒绝”元素的处理有关。如果共享元素未附加到窗口,则会拒绝该共享元素(从转换中排除),这可能因为其可见性设置为GONE而发生。

我正在使用的解决方法是在调用makeSceneTransitionAnimation()之前检查每个潜在的共享元素视图,如果其可见性设置为VISIBLE,则仅将其包含在列表中。

答案 2 :(得分:4)

如果API低于5.1,则使用postponeEnterTransition()推迟共享元素转换。将听众OnDrawListener注册到装饰视图(可能)或内容视图(ViewTreeObserver)的android.R.id.content,并在调用onDraw()后开始转换。一旦开始转换,不要忘记取消注册监听器。