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

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

Фатальное исключение: java.lang.NullPointerException: попытка вызвать виртуальный метод «android.view.ViewParent android.view.View.getParent()» для ссылки на нулевой объект в 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.disp atchOnPreDraw(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: /#F0">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 (все системные классы в стеке)?


person Markus Junginger    schedule 07.01.2016    source источник
comment
Я думаю, что в магазине Play есть такая же проверка для 5.1.   -  person vRallev    schedule 07.01.2016
comment
Это происходит со всеми мобильными телефонами? Я не могу воспроизвести его с помощью эмулятора (genymotion) с версией 5.0.x   -  person ignacio_gs    schedule 03.02.2016
comment
Это не совсем воспроизводимо. Следите за отчетами о сбоях, если они относятся к вашему приложению.   -  person Markus Junginger    schedule 04.02.2016


Ответы (3)


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

person Markus Junginger    schedule 26.01.2016

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

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

person Glenn Schmidt    schedule 04.12.2016
comment
Не только видно. Вы должны поместить в метод makeSceneTransitionAnimation только те представления, которые представлены в первом и втором действии. Я помещаю просмотры, которые были только в первой активности, и это вызывает сбой - person Deni Erdyneev; 03.07.2018

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

person Nikola Despotoski    schedule 08.01.2016
comment
когда я это делаю, OnDdraw() никогда не вызывается. - person Boy; 06.06.2016