Absturz bei Aktivitätsübergängen mit SharedElement

Lesezeit: 4 Minuten

Benutzeravatar von OferM
OferM

Ich verwende Aktivitätsübergänge von einem ViewPager (in der aufrufenden Aktivität) mit einem gemeinsam genutzten Element und auch Inhaltsübergänge. Ich bekomme diesen Absturz, wenn ich wieder in die Anrufaktivität eintritt:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.ResultReceiver.send(int, android.os.Bundle)' on a null object reference
  at android.app.EnterTransitionCoordinator.sendSharedElementDestination(EnterTransitionCoordinator.java:199)
  at android.app.EnterTransitionCoordinator.viewsReady(EnterTransitionCoordinator.java:123)
  at android.app.EnterTransitionCoordinator$2.onPreDraw(EnterTransitionCoordinator.java:148)
  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:895)
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2153)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1180)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6558)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
  at android.view.Choreographer.doCallbacks(Choreographer.java:590)
  at android.view.Choreographer.doFrame(Choreographer.java:560)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:145)
  at android.app.ActivityThread.main(ActivityThread.java:5832)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)

Außerdem beginnt der Bildschirm nach dem Zurückgehen kontinuierlich zu flackern, wobei ein weißer Bildschirm ein- und ausblendet.

Hier sind meine Übergangsflaggen:

<item name="android:windowContentTransitions">true</item>
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>

Ich habe versucht, Enter/Exit-Übergänge sowohl für die Anruf- als auch für die Anrufaktivität festzulegen, aber kein Glück.

  • Wow, das ist neu. Idealerweise würden Sie einen Fehler mit einer App melden, die ihn reproduzieren kann. Es scheint, dass die austretende Aktivität den ResultReceiver irgendwie auf null gesetzt hat. Wenn Sie dies auf keine andere Weise lösen können, können Sie finish() anstelle von finishAfterTransition() verwenden, um den Aktivitätsübergang zu vermeiden, aber es ist ziemlich seltsam. Ist es möglich, dass die austretende Aktivität beendet wird, während die neu eintretende Aktivität gestartet wird?

    – Georg Berg

    11. Dezember 2015 um 3:10 Uhr


  • @GeorgeMount glaube nicht. Wenn A die aufrufende Aktivität und B die aufgerufene Aktivität ist, lauten meine Protokolle bei der Eingabe von B wie folgt: A: onPause B: onCreate B: onStart B: onResume B: onSaveInstanceState A: onStop

    – OferM

    13. Dezember 2015 um 8:05 Uhr


  • Und dann sollte es beim erneuten Betreten idealerweise lauten: A: onStart (crash is here) B: onPause A: onResume B: onStop B: onDestroy

    – OferM

    13. Dezember 2015 um 9:06 Uhr

  • Ich habe auch bemerkt, dass der Übergang zum erneuten Betreten für die ersten 2 Fragmente im ViewPager funktioniert und für den Rest der Elemente ständig abstürzt. Der ViewPager enthält immer dasselbe Fragment, es handelt sich also nicht um ein spezifisches Fragmentproblem.

    – OferM

    13. Dezember 2015 um 9:31 Uhr

  • Ich habe das gleiche Problem bemerkt, das manchmal in meiner App auftritt, wenn ich vom Detailbildschirm zum Sammlungsbildschirm mit Viewpager zurückwechsele und beide Bildschirme eine gemeinsame Bildansicht mit Übergangsanimation haben.

    – Ankur

    30. Dezember 2015 um 9:12 Uhr

Benutzeravatar von FRIST_008
FRIST_008

Versuchen Sie, ein Fragment von zu bekommen FragmentManager:

fragmentManager.findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + position)

Wenn fragment null ist, versuchen Sie, ein neues Fragment zu erstellen.

Benutzeravatar von Jivanlal Bhavsar
Jivanlal Bhavsar

Aktivitätsübergänge mit gemeinsam genutzten Elementen können aus verschiedenen Gründen manchmal zu Abstürzen führen. Hier sind einige häufige Ursachen für Abstürze und wie man sie vermeidet:

Timing-Probleme: Stellen Sie sicher, dass die freigegebenen Elemente die richtige Größe und Anordnung haben, bevor der Übergang beginnt. Das Verzögern des Übergangsstarts, bis die gemeinsam genutzten Elemente vollständig initialisiert wurden, kann Abstürze verhindern.

Inkonsistente Namen: Wenn Sie gemeinsame Elementübergänge zwischen Aktivitäten verwenden, stellen Sie sicher, dass die Namen der gemeinsamen Elemente in beiden Aktivitäten gleich sind. Nicht übereinstimmende Namen können zu einem Absturz führen.

Unsachgemäße Verwendung von View.setTransitionName(): Bei der Verwendung von Übergängen für gemeinsam genutzte Elemente ist es wichtig, einen eindeutigen Übergangsnamen für jedes gemeinsam genutzte Element festzulegen. Wenn zwei gemeinsam genutzte Elemente denselben Übergangsnamen haben, kann es zu einem Absturz kommen.

OutOfMemoryErrors: Große Bilder oder Bitmaps, die als gemeinsam genutzte Elemente verwendet werden, können OutOfMemoryErrors verursachen, was zu einem Absturz führt. Um dies zu vermeiden, stellen Sie sicher, dass Sie die Größe der Bilder oder Bitmaps auf eine kleinere Größe ändern, bevor Sie sie als gemeinsam genutzte Elemente verwenden.

Fehlender Übergang in XML: Wenn der Übergang zwischen den beiden Aktivitäten nicht in XML definiert ist, kann es zu einem Absturz kommen. Stellen Sie sicher, dass der Übergang im XML richtig definiert ist und dass der richtige Übergang für die gemeinsam genutzten Elemente verwendet wird.

Hier ist ein bestes Beispiel für die Vermeidung von Timing-Problemen bei der Verwendung gemeinsam genutzter Elemente:

private void startActivityWithSharedElement(Intent intent) {
    final ImageView sharedImageView = findViewById(R.id.shared_image_view);

    sharedImageView.getViewTreeObserver().addOnPreDrawListener(

        new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {

         sharedImageView.getViewTreeObserver().removeOnPreDrawListener(this);
         startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(
                                MainActivity.this, sharedImageView, "shared_image").toBundle());
                return true;
            }
        });
}

1443120cookie-checkAbsturz bei Aktivitätsübergängen mit SharedElement

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy