2016-01-07 9 views
13

でNPEが発生し、アプリに、アクティビティの遷移を入力して、私は次のようなクラッシュレポートを取得しています:EnterTransitionCoordinatorがexitを追加した後のAndroid 5.0

致命的な例外:java.lang.NullPointerExceptionが: 仮想メソッドを呼び出すための試みを'android.view.ViewParent()'ヌルオブジェクト参照の の画像 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 $ 5 $ 1.runでandroid.app.EnterTransitionCoordinator.access $ 200(EnterTransitionCoordinator.java:42) でandroid.app.EnterTransitionCoordinator.startSharedElementTransition(EnterTransitionCoordinator.java:325) で(EnterTransitionCoordinator.java:389 )android.app.EnterTransitionCoordinator $ 5.onPreDraw(EnterTransitionCoordinator.java:386)android.view.ViewTreeObserver.dispatchOnPreDrawで でandroid.app.ActivityTransitionCoordinator.startTransition(ActivityTransitionCoordinator.java:698) で (ViewTreeObserver.java:847) android.view.View.ViewRootImpl.doTraversal(ViewRootImpl.java:1985)の android.view.View.RootImpl.doTraversal(ViewRootImpl.java:1077)の android.view.Vi ewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5845) (android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767) android.view.Choreographer.doCallbacks(Choreographer.java:580) at android。 view.Choreographer.doFrame(Choreographer.java:550) (android.view.Choreographer)$ FrameDisplayEventReceiver.run(Choreographer.java:753) (android.os.Handler.handleCallback(Handler.java:739) )でアンドロイド。 os.Handler.dispatchMessage(Handler.java:95) android.os.Looper.loop(Looper.java:135) (android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang。 reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372)com.android.internal.os.ZygoteInit.mainでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:909) で(ZygoteInit.java:704)

はそうではありません再生可能ですが、クラッシュ数は重要です。いくつかの研究を行う

は、私はそれをされて示唆コミットこの出くわしたアンドロイドの内部エラー(実際にあった):すべてのクラッシュレポートは、5.0、5.0.1、または5.0.2のどちらかである https://android.googlesource.com/platform/frameworks/base/+/83c692efd3c53050fce132dfd2ef21763d3cf010%5E%21/#F0

。 5.1では広がりが広がっているがクラッシュは見られないため、5.1でEnterTransitionCoordinatorが修正されたようです。

したがって、可能な解決策は、APIレベル22以上を確認してから移行を行うことです。しかし、もっと良い方法があるのだろうかと思います。いくつかの回避策は、これはAndroidの内部問題(スタック内のすべてのシステムクラス)であるように思われるかもしれません。

+1

Playストアには5.1と同じチェックがあると思います。 – vRallev

+0

これはすべてのモバイルで発生しますか?バージョン5.0.xのエミュレータ(genymotion)で再現することはできません –

+0

本当に再現できません。アプリに適用される場合は、クラッシュレポートに注目してください。 –

答えて

6

移行のためにAPIレベル22(Android 5.1)が必要な場合、クラッシュはなくなりました。これは最も簡単な解決策です。 Android 5.0でこれをサポートする必要がある場合は、Nikolaの答えを確認してください(追加コードを避けるために自分で試してみませんでした)。

3

APIよりも5.1より低い場合は、postponeEnterTransition()を使用して共有要素の移行を延期します。装飾ビュー(おそらく)またはコンテンツビュー(android.R.id.content)のViewTreeObserverにリスナーOnDrawListenerを登録し、onDraw()が呼び出されると、トランジションを開始します。移行を開始すると、リスナーを登録解除することを忘れないでください。

+3

これを行うと、 'OnDdraw()'は決して呼び出されません。 – Boy

3

このAndroid OSのバグは、共有要素の移行中に「拒否された」要素の処理に関連しています。可視性がGONEに設定されているため、共有要素がウィンドウにアタッチされていないと、拒否されます(遷移から除外されます)。

私が使用している回避策は、に設定されている場合は、makeSceneTransitionAnimation()を呼び出す前に、それぞれの潜在的共有要素ビューをチェックし、リストにのみ含めます。

+0

このソリューションは、実際に動作する唯一のソリューションです –

関連する問題