2012-06-04 11 views
94

ho pensato che il sistema avrebbe animazioni invertire sulla backstack quando viene premuto il pulsante Indietro quando si utilizza frammenti utilizzando il seguente codice:Come ripristinare le animazioni dei frammenti su 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(); 

risposta

222

Secondo il android documentation for custom animation:

Cambio:

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

A:

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

e ora il backstack si anima - Al contrario !!

+2

btw, so che questo non è collegato alla tua domanda e risposta, ma potrebbe voi forse mi collegare a qualcosa che spiega customAnimations a un po? : P – AreusAstarte

+4

Grazie mille. Bella risposta. –

+2

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

14

Utilizzare l'animazione corretta Ho usato il seguente ed il suo lavoro come un fascino

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> 

quindi utilizzare seguente aggiungendo frammento

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

e sarà lavorato 100%

+2

Nota che questo non funzionerà se stai utilizzando il gestore framment di supporto o se il tuo frammento estende la versione di supporto di Fragment – w3bshark

+0

@ w3bshark Come far funzionare queste animazioni usando 'FragmentManager' e' Fragment' dalla libreria di supporto? –

+1

@DanielShatz È necessario utilizzare le traduzioni anziché objectAnimators. Ad esempio, slide_in_left.xml sarebbe: '' Leggi questa risposta: 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) 

Sostituire il precedente con:

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

Ti consiglierei di aggiungere una spiegazione su come la tua raccomandazione è d'aiuto. – Wtower

+2

Non so perché funzioni (:, ma quando l'animazione aggiunta dopo 'replace' e' addToBackstack', non viene eseguita – TarikW

+2

@TarikW sono un po 'in ritardo, ma l'ordine è importante in questo, è necessario chiamare setCostomAnimations prima di sostituire , metodi AddToBackStack – Tahir

1

nel mio caso

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

creerebbe animazioni perfette.

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

Cool ... Ha funzionato per me. –

Problemi correlati