Wie kann man Fragmentanimationen auf BackStack umkehren?

114

Ich dachte, das System würde Animationen auf dem Backstack umkehren, wenn die Zurück-Taste gedrückt wird, wenn Fragmente mit dem folgenden Code verwendet werden:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);
ft.replace(R.id.viewContainer, new class(), "layout").addToBackStack(null).commit();

quelle

Antworten:

265

Laut der Android-Dokumentation für benutzerdefinierte Animationen :

Veränderung:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);

Zu:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out );

und jetzt animiert der Backstack - umgekehrt !!


quelle
2
Übrigens, ich weiß, dass dies nicht mit Ihrer Frage und Antwort zusammenhängt, aber könnten Sie mich vielleicht mit etwas verknüpfen, das customAnimations ein wenig erklärt? : P
AreusAstarte
2
AreusAstarte: siehe developer.android.com/reference/android/app/… , int, int, int)
mDroidd
Hallo, ich verwende tatsächlich den Inhaltsübergang, funktioniert einwandfrei, aber wenn ich zurückdrücke und zum vorherigen Fragment gehe, verschwindet der Hintergrund nur, um die Ansichten zu animieren, aber auch mit den vorherigen zu überlagern. Gibt es eine Möglichkeit, dies zu vermeiden?
user3497504
23

Verwenden Sie die richtige Animation. Ich habe Folgendes verwendet und es funktioniert wie ein Zauber

slide_in_left.xml

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

slide_in_right.xml

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="1000"
        android:valueType="floatType" />

</set>

slide_out_left.xml

   <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-1000"
        android:valueType="floatType" />

</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="-1000"
        android:valueTo="0"
        android:valueType="floatType" />

</set>

Verwenden Sie dann Folgendes, während Sie ein Fragment hinzufügen

setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left,
                                R.anim.slide_out_right, R.anim.slide_in_right)

und es wird 100% funktionieren

Aniket
quelle
2
Beachten Sie, dass dies nicht funktioniert, wenn Sie den Support-Fragment-Manager verwenden oder wenn Ihr Fragment die Support-Version von Fragment
w3bshark
@ w3bshark Wie kann man solche Animationen mit FragmentManagerund Fragmentaus der Support-Bibliothek zum Laufen bringen ?
Daniel Shatz
2
@DanielShatz Sie müssen Übersetzungen anstelle von objectAnimators verwenden. Zum Beispiel wäre slide_in_left.xml: <translate android:fromXDelta="100%" android:startOffset="25" android:toXDelta="0" />Siehe diese Antwort: stackoverflow.com/a/5151774/1738090
w3bshark
1
Ich probiere dies aus (auf Marshmallow-Gerät - habe keine anderen Versionen ausprobiert). Es funktioniert nicht. final FragmentTransaction fragmentTransaction = getFragmentManager (). beginTransaction (); fragmentTransaction.setCustomAnimations (R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right); fragmentTransaction.replace (R.id.fl_right_container, detailFragment); fragmentTransaction.replace (R.id.fl_left_container, UnterkategorienFragment, TestActivity.TAG_SUBCATEGORIES_FRAGMENT); fragmentTransaction.commit ();
Techtinkerer
13

in meinem Fall

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, 
                       R.anim.slide_in_right, R.anim.slide_out_left);

würde perfekte Animation erstellen.

slide_in_right

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-50%p"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>
Hoang Nguyen Huu
quelle
1
Ich dachte daran, es selbst zu tun, aber ich bin zu faul. Und ich sagte, jemand hätte dies auf StackOverflow posten sollen und hier ist es! haha
F.Mysir
1
Niemand hatte dies zuvor gepostet und ich war der festen Überzeugung, dass ich an der Reihe war, diese Antwort zu posten, um zu helfen, wer in den gleichen Schuhen wie ich sein könnte ... lol @ F.Mysir
Hoang Nguyen Huu
3
.setCustomAnimations(R.animator.fragment_fade_in,
        R.animator.fragment_fade_out,
        R.animator.fragment_fade_p_in,
        R.animator.fragment_fade_p_out)

Ersetzen Sie das oben Gesagte durch:

mFragmentManager.beginTransaction()
    .setCustomAnimations(R.animator.fragment_fade_in,
            R.animator.fragment_fade_out,
            R.animator.fragment_fade_p_in,
            R.animator.fragment_fade_p_out)
    .replace(R.id.main_container, FragmentPlayerInfo.getInstance(data))
    .addToBackStack(FragmentPlayerInfo.TAG)
    .commit();
TarikW
quelle
1
Ich würde Ihnen empfehlen, eine Erklärung hinzuzufügen, wie Ihre Empfehlung hilft.
Wtower
2
Ich weiß nicht, warum es funktioniert (:, aber wenn Animation nach replaceund hinzugefügt addToBackstackwird, funktioniert es nicht
TarikW
2
@ TarikW Ich bin etwas spät dran, aber die Reihenfolge ist wichtig. Sie müssen setCostomAnimations aufrufen, bevor Sie ersetzen. AddToBackStack-Methoden
MD Husnain Tahir
1

Dies ist wie in der Fragmenttransaktionsklasse erwähnt.

/**
     * Set specific animation resources to run for the fragments that are
     * entering and exiting in this transaction. The <code>popEnter</code>
     * and <code>popExit</code> animations will be played for enter/exit
     * operations specifically when popping the back stack.
     *
     * @param enter An animation or animator resource ID used for the enter animation on the
     *              view of the fragment being added or attached.
     * @param exit An animation or animator resource ID used for the exit animation on the
     *             view of the fragment being removed or detached.
     * @param popEnter An animation or animator resource ID used for the enter animation on the
     *                 view of the fragment being readded or reattached caused by
     *                 {@link FragmentManager#popBackStack()} or similar methods.
     * @param popExit An animation or animator resource ID used for the enter animation on the
     *                view of the fragment being removed or detached caused by
     *                {@link FragmentManager#popBackStack()} or similar methods.
     */
    @NonNull
    public abstract FragmentTransaction setCustomAnimations(@AnimatorRes @AnimRes int enter,
            @AnimatorRes @AnimRes int exit, @AnimatorRes @AnimRes int popEnter,
            @AnimatorRes @AnimRes int popExit);

Endlich können Sie diese Methode verwenden

 mFragmentManager.beginTransaction()
                        .replace(R.id.container, fragment)
                        .setCustomAnimations(R.anim.slide_left,//enter
                                             R.anim.slide_out_left,//exit
                                             R.anim.slide_right,//popEnter
                                             R.anim.slide_out_right)//popExit
                        .addToBackStack(fragment.toString())
                        .commit();
Islam Alshnawey
quelle
0

diese Arbeit für mich !! dieser Code für Fragment! Wenn Sie diesen Code in Aktivitäten verwenden möchten, löschen Sie ihn am Anfang getActivity()!!

getActivity().getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.fade_out,android.R.anim.slide_in_left, android.R.anim.fade_out)
        .replace(R.id.fragment_container, new YourFragment)
        .addToBackStack(null)
        .commit();

Viel Glück!!

MODERN
quelle