EnterTransitionCoordinator causa NPE en Android 5.0

Después de agregar salidas e ingresar transiciones de actividad a una aplicación, estoy recibiendo informes de fallo como los siguientes:

Excepción Fatal: java.lang.NullPointerException: Intenta invocar el método virtual 'android.view.ViewParent android.view.View.getParent ()' en una referencia de objeto nulo en android.view.ViewOverlay $ OverlayViewGroup.add (ViewOverlay.java: 164) en android.view.ViewGroupOverlay.add (ViewGroupOverlay.java:63) en android.app.EnterTransitionCoordinator.startRejectedAnimations (EnterTransitionCoordinator.java:598) en android.app.EnterTransitionCoordinator.startSharedElementTransition (EnterTransitionCoordinator.java:325) en android. App.EnterTransitionCoordinator.access $ 200 (EnterTransitionCoordinator.java:42) en android.app.EnterTransitionCoordinator $ 5 $ 1.run (EnterTransitionCoordinator.java:389) en android.app.ActivityTransitionCoordinator.startTransition (ActivityTransitionCoordinator.java:698) en android.app. EnterTransitionCoordinator $ 5.onPreDraw (EnterTransitionCoordinator.java:386) en android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:847) en android.view.ViewRootImpl.performTraversa Ls (ViewRootImpl.java:1985) en android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1077) en android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:5845) en android.view.Choreographer $ CallbackRecord.run (Choreographer.java:767) en android.view.Choreographer.doCallbacks (Choreographer.java:580) en android.view.Choreographer.doFrame (Choreographer.java:550) en android.view.Choreographer $ FrameDisplayEventReceiver.run (coreógrafo. Java: 753) en android.os.Handler.handleCallback (Handler.java:739) en android.os.Handler.dispatchMessage (Handler.java:95) en android.os.Looper.loop (Looper.java:135) at Android.app.ActivityThread.main (ActivityThread.java:5272) en java.lang.reflect.Method.invoke (Method.java) en java.lang.reflect.Method.invoke (Method.java:372) en com.android .internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:909) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:704)

No es reproducible, pero el conteo de fallos es significativo.

Al hacer algunas investigaciones, me encontré con este commit sugiriendo que es (en realidad fue) un error interno en Android: https://android.googlesource.com/platform/frameworks/base/+/83c692efd3c53050fce132dfd2ef21763d3cf010%5E%21/#F0

Todos los informes de fallo son 5.0, 5.0.1 o 5.0.2. Debido a que 5.1 tiene una propagación más amplia, pero no muestra bloqueos, parece que EnterTransitionCoordinator se corrigió en 5.1.

Por lo tanto, una posible solución sería comprobar la API nivel 22 o superior, y sólo hacer las transiciones entonces. Sin embargo me pregunto si hay una mejor manera; Alguna solución quizás, a pesar de esto parece ser una cuestión interna de Android (todas las clases del sistema en la pila)?

Después de requerir el nivel API 22 (Android 5.1) para la transición, los bloqueos han desaparecido. Esta es la solución más sencilla. Si necesitas apoyar esto con Android 5.0, comprueba la respuesta de Nikola (no lo probamos nosotros mismos para evitar el código adicional).

Para menor que API que 5.1, posponga la transición de elementos compartidos usando postponeEnterTransition() . Registre un listener OnDrawListener en ViewTreeObserver de la vista de decoración (quizás) o de contenido ( android.R.id.content ) e inicie la transición una vez que onDraw() se llame. No olvide cancelar el registro del oyente, una vez que inicie la transición.

Este error del SO para Android se relaciona con el manejo de elementos "rechazados" durante la transición del elemento compartido. Un elemento compartido será rechazado (excluido de la transición) si no está conectado a la ventana, lo que podría suceder porque su visibilidad se establece en GONE .

La solución que estoy usando es comprobar cada posible vista de elementos compartidos antes de llamar a makeSceneTransitionAnimation() , e incluirla sólo en la lista si su visibilidad está establecida en VISIBLE .

  • Transiciones de elementos compartidos entre vistas (no actividades o fragmentos)
  • Elemento de transición Elemento compartido de TextView a EditText
  • ViewRootImpl.setPausedForTransition (boolean) NullPointerException en ActivityTransitionCoordinator cuando la transición a otra Actividad se invoca demasiado pronto
  • ¿Cómo se puede saber si una actividad se inicia sin una transición?
  • Animar el cambio de diseño de la hoja inferior
  • Transición de elementos compartidos de Android, posición inicial incorrecta
  • Cancelar la transición de retorno compartida en Android Lollipop
  • Cómo implementar fragmento resizableable por arrastre de usuario (no animación de transición predefinida)
  • Lollipop actividad de transición de elemento compartido con fade
  • Compartir Imagen elemento de transición tamaño incorrecto
  • Marco de transición de Android y datos de la red
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.