Подтвердить что ты не робот

EnterTransitionCoordinator вызывает NPE в Android 5.0

После добавления выхода и перехода активности в приложение я получаю отчеты о сбоях, как показано ниже:

Fatal Exception: java.lang.NullPointerException: попытка вызвать virtual method 'android.view.ViewParent android.view.View.getParent()' по ссылке на нулевой объект        на android.view.ViewOverlay $OverlayViewGroup.add(ViewOverlay.java:164)        в android.view.ViewGroupOverlay.add(ViewGroupOverlay.java:63)        at android.app.EnterTransitionCoordinator.startRejectedAnimations(EnterTransitionCoordinator.java:598)        в android.app.EnterTransitionCoordinator.startSharedElementTransition(EnterTransitionCoordinator.java:325)        at android.app.EnterTransitionCoordinator.access $200 (EnterTransitionCoordinator.java:42)        at android.app.EnterTransitionCoordinator $5 $1.run(EnterTransitionCoordinator.java:389)        at android.app.ActivityTransitionCoordinator.startTransition(ActivityTransitionCoordinator.java:698)        at 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)        at android.view.ViewRootImpl $TraversalRunnable.run(ViewRootImpl.java:5845)        на android.view.Choreographer $CallbackRecord.run(Хореограф.ява: 767)        на android.view.Choreographer.doCallbacks(Хореограф .java:580)        на android.view.Choreographer.doFrame(Хореограф .java:550)        на android.view.Choreographer $FrameDisplayEventReceiver.run(Хореограф.ява: 753)        на android.os.Handler.handleCallback(Handler.java:739)        на android.os.Handler.dispatchMessage(Handler.java:95)        на android.os.Looper.loop(Looper.java:135)        at android.app.ActivityThread.main(ActivityThread.java:5272)        в java.lang.reflect.Method.invoke(Method.java)        в java.lang.reflect.Method.invoke(Method.java:372)        at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:909)        at 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 (все системные классы в стеке)?

4b9b3361

Ответ 1

После перехода на уровень API 22 (Android 5.1) для перехода, сбои исчезли. Так что это самое простое решение. Если вам нужно поддержать это с помощью Android 5.0, проверьте ответ Nikola (мы не пробовали самостоятельно избегать дополнительного кода).

Ответ 2

Для более низкого, чем API, чем 5.1, отложите переход общего элемента с помощью postponeEnterTransition(). Зарегистрируйте слушателя OnDrawListener в ViewTreeObserver в представлении декора (возможно) или в виде содержимого (android.R.id.content) и начните переход, когда вызывается onDraw(). Не забудьте отменить регистрацию слушателя, как только вы начнете переход.

Ответ 3

Эта ошибка ОС Android связана с обработкой элементов "отбракованных" во время перехода общего элемента. Общий элемент будет отклонен (исключен из перехода), если он не прикреплен к окну, что может произойти, потому что его видимость установлена ​​на GONE.

Обходной путь, который я использую, - проверить каждый потенциальный общий вид элемента перед вызовом makeSceneTransitionAnimation() и включить его только в список, если его видимость установлена ​​на VISIBLE.