2013-04-26 15 views
9

Abbiamo un'attività che contiene uno SlidingMenu (https://github.com/jfeinstein10/SlidingMenu), in cui ci sono tre opzioni, chiamiamoli A, B1, C1. Questi corrispondono ai Frammenti che mostriamo nell'Attività. Quando selezioni un'opzione diversa da SlidingMenu, sostituisco il frammento corrente con quello nuovo tramite FragmentManager.Cancella stack back di frammenti Android senza scoppiare?

Da Frammento B1 si può andare a due altri, chiamiamoli B2 e B3. Qui vogliamo che il tasto Indietro ti porti da B2 -> B1 o da B3 -> B1, quindi chiamo transaction.addToBackStack (null). Se selezioniamo un'opzione dal SlidingMenu quando sei in B2 o B3 vogliamo cancellare la pila avanti, per cui uso il codice come suggerito in questa domanda Clear back stack using fragments che chiama popBackStack() finché non è chiaro.

Fin qui tutto bene.

Da Frammento C1 si può andare al frammento C2. Come C1/C2 sono più di un disegno master/dettaglio che uso

fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_right, 
    R.animator.slide_out_to_left, R.animator.slide_in_from_left, 
    R.animator.slide_out_to_right); 

aggiungere un'animazione diapositiva in cui C1 scivola fuori a sinistra come C2 scorre da destra, e viceversa. Premendo il tasto Indietro mentre ci si trova in C2, si torna a C1, con l'animazione inversa, e tutto è buono.

MA

Se si seleziona A o B1 dal SlidingMenu e noi popBackStack() per sbarazzarsi di C1 dalla pila schiena, poi scivola C2 verso destra, che sembra strano. Quello che mi piacerebbe fare è cancellare il back stack senza eseguire l'animazione, ma non riesco a trovare un modo per farlo. Ho provato a chiamare popBackStackImmediate() invece, ma questo non sembra fare alcuna differenza.

Come alternativa Credo che avrei potuto evitare di chiamare addToBackStack a tutti, e invece manualmente gestire l'utente preme il tasto Indietro via Activity.onBackPressed(), ma forse c'è una soluzione non riesco proprio a vedere?

risposta

6

Si potrebbe provare il seguito, anche se sono familiarità con .remove() sembra che dovrebbe fare quello che vuoi:

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack"); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.remove(myFragC1); 
transaction.commit(); 
+0

che sembra fare esattamente quello che mi serve. Grazie! –

+0

@JonathanCaryl Ottimo! Sono contento che ha funzionato come io non ero davvero sicuro al 100% che sarebbe :) – TronicZomB

+0

Non funziona per me con libreria di supporto v23.1.1 –

3

Purtroppo, non so come fare correttamente: ecco la mia soluzione (in realtà ho abbastanza modificati diversi StackOverflow answer)

In classe frammento di base che è estesa da tutti gli altri frammenti):

public static boolean sDisableExitAnimation = false; 

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
    if (sDisableExitAnimation && !enter) { 
     return AnimationUtils.loadAnimation(getActivity(), R.anim.clear_stack_exit); 
    } 
    return super.onCreateAnimation(transit, enter, nextAnim); 
} 

Per cancellare pila è necessario chiamare:

ScreenFragment.sDisableExitAnimation = true; 
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

E infine clear_stack_exit animazione stessa (non ho trovato un modo per ottenere da FragmentManager stesso):

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

    <alpha 
     android:fromAlpha="1" 
     android:toAlpha="0" 
     android:duration="220" 
     /> 

    <scale 
     android:fromXScale="1" 
     android:toXScale="0.975" 
     android:fromYScale="1" 
     android:toYScale="0.975" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="220" 
     /> 

</set> 

In questo modo si' Avremo la corretta animazione dello stack trasparente. Non dimenticare di cancellare la variabile sDisableExitAnimation prima di iniziare la prossima transizione.

+0

Grazie mille, è un lavoro fantastico –

Problemi correlati