2012-06-04 12 views
94

Myślałem, że system będzie odwrócić animacje na backstack gdy przycisk wstecz jest wciśnięty przy użyciu fragmentów stosując następujący kod:Jak cofnąć animacje fragmentów na BackStack?

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(); 

Odpowiedz

222

Według android documentation for custom animation:

Zmiana:

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

Do:

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

, a teraz animacja backstack - W odwrotnej kolejności !!

+2

btw, wiem, że to nie jest podłączony do Twojego pytania i odpowiedzi, ale można połączyć może mnie do czegoś, co wyjaśnia customAnimations do trochę? : P – AreusAstarte

+4

Dziękuję bardzo. Świetna odpowiedź. –

+2

AreusAstarte: patrz http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int) – mDroidd

14

używać odpowiedniego animacja Użyłem następujących i jego pracy jak czar

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> 

Następnie za pomocą następujących dodając fragment

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

i pracował 100%

+2

Uwaga: to nie zadziała, jeśli używasz menedżera fragmentów pomocy technicznej lub jeśli twój fragment rozszerza wersję pomocy o Fragment – w3bshark

+0

@ w3bshark Jak uzyskać takie animacje działające przy użyciu 'FragmentManager' i' Fragment' z biblioteki wsparcia? –

+1

@DanielShatz Musisz używać tłumaczeń zamiast obiektów objectAnimator. Na przykład slide_in_left.xml będzie: '' Zobacz tę odpowiedź: http://stackoverflow.com/a/5151774/1738090 – w3bshark

2
.setCustomAnimations(R.animator.fragment_fade_in, 
     R.animator.fragment_fade_out, 
     R.animator.fragment_fade_p_in, 
     R.animator.fragment_fade_p_out) 

Wymień powyżej:

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(); 
+1

Polecam, aby dodać wyjaśnienie, w jaki sposób pomoc pomaga. – Wtower

+2

Nie wiem, dlaczego to działa (:, ale gdy dodana animacja po 'replace' i' addToBackstack', nie działa – TarikW

+2

@TarikW Trochę się spóźniłem, ale kolejność jest ważna w tym, musisz wywołać setCostomAnimations przed wymianą Metody addToBackStack – Tahir

1

w moim przypadku

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

stworzy doskonałą animację.

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> 
+0

Fajnie ... To działało dla mnie. –