Fragment in einer Aktivität per Animation austauschen


94

Ich möchte zwei Fragmente in einer Aktivität über eine Animation austauschen. Angenommen, Seite A steht für Fraging A und die linke Seite des Bildschirms, und Seite B steht für Fragment B, dh auf der rechten Seite des Bildschirms. Wenn ich auf Seite A auf eine Schaltfläche klicke, wird Seite A mit einer Übergangsanimation auf die rechte Seite des Bildschirms verschoben.

Ich habe versucht, den folgenden Code zu verwenden, um die Position zu ersetzen

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Auf der Suche nach einem Hinweis.

Danke im Voraus.


Antworten:


282

Alte Frage und Sie haben es wahrscheinlich schon herausgefunden, aber zum späteren Nachschlagen:

Folgendes verwenden Sie, um eine benutzerdefinierte Animation festzulegen, wenn Sie ein Fragment über Code ersetzen:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Hier ist ein Beispiel für die Animation slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Beachten Sie, dass dies die Animation ist, wenn Sie die Kompatibilitätsbibliothek verwenden. Wenn Sie stattdessen ein SDK mit nativer Unterstützung für den FragmentManager verwenden, sieht Ihre Animation folgendermaßen aus:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Dies liegt daran, dass die Kompatibilitätsbibliothek den neuen objectAnimator-Typ nicht unterstützt und stattdessen nur das alte Animationsframework implementiert.


92
Dies ist definitiv die richtige Antwort. Beachten Sie, dass die Reihenfolge wichtig ist! Sie müssen den Aufruf setCustomAnimations () haben, bevor Sie Aufrufe hinzufügen / ersetzen!
theelfismike

2
Also, welchen Ansatz solltest du verwenden, wenn du die beste Komposition willst?
K - Die Toxizität in SO nimmt zu.

17
Diese verschiedenen Animationen sind nicht genau gleich. Sie nehmen an, dass die Breite Ihres Fragments 1280 entspricht, indem Sie einen Wert von -1280 verwenden. Wenn die Breite größer war, wird sie nicht vollständig außerhalb des Bildschirms gestartet.
egfconnor

51
Sie können stattdessen die vordefinierten Animationen aus dem Android-Namespace verwenden: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy

2
Die vordefinierten Animationen lösen eine Laufzeitausnahme (FWIW) aus, da sie auf dem Tag "translate" basieren.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.