2013-08-19 8 views
6

voglio essere in grado di invertire un replaceFragmentTransaction utilizzando addToBackStack():clic su Indietro pulsante dopo una transazione Frammento utilizzando addToBackStack non fa nulla

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();   
Fragment scheduleFragment = new ScheduleFragment();  
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment"); 
fragmentTransaction.addToBackStack("scheduleFragment"); 
fragmentTransaction.commit(); 

, ma dopo che, facendo clic sul pulsante Indietro non fa nulla.

Dal doc e si suppone di invertire la transazione.

Cosa mi manca?

+2

Il [doc] (http://developer.android.com/training/implementing-navigation/temporal.html) (vedere "Implementare indietro la navigazione per frammenti") dice di usare '.add' invece di' .replace '. Controlla le risposte qui: http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack ma suppongo che '.replace' non sia completamente supportato mentre' .add' sembra funzionare correttamente. – electrocrat

+0

La risposta di @Abel Paz 'è la giusta soluzione per il problema con '.replace' – electrocrat

risposta

4

Prova fragmentTransaction.addToBackStack(null) Il parametro per addToBackStack() è un nome opzionale per lo stato di nuovo, non si utilizza il tag nel metodo replace() che è solo un tag facoltativa per il frammento. Ulteriori informazioni su questo here.

+0

Ho bisogno del tag. – jul

+0

Sì, puoi mantenere il tag per fare riferimento al frammento, ma l'uso di 'addToBackStack (null)' funziona? Cosa succede se lo usi? –

+0

Non ho provato perché non ha senso per me. Quindi ho implementato il mio stack 'Fragment' (vedi la mia risposta). – jul

0

ho implementato il mio Fragment stack:

public Fragment addFragmentToStack(Fragment fragment){ 
    if(MyApplication.fragmentStack.size()>20){ 
     MyApplication.fragmentStack.remove(0); 
    } 
    return MyApplication.fragmentStack.push(fragment); 
} 

public void onBackPressed() { 
     if (MyApplication.fragmentStack.size() > 0) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_container, MyApplication.fragmentStack.pop()); 
      ft.commit(); 
     } 
     else{ 
      finish(); 
     } 
} 
24

Il modo giusto per farlo è usare onBackPressed() metodo per catturare quel di nuovo evento nella vostra app, e poi "pop" del backStack con popBackStack(). Per esempio:

public void onBackPressed() 
{ 
    // Catch back action and pops from backstack 
    // (if you called previously to addToBackStack() in your transaction) 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportFragmentManager().popBackStack(); 
    } 
    // Default action on back pressed 
    else super.onBackPressed(); 
} 

PD: Ci scusiamo per la segreteria ritardo, ma ho appena visto la tua domanda. Spero che sia d'aiuto!

+0

Allora perché diavolo, nella documentazione di Android, hanno comunicato la strada sbagliata. :( –

+2

Non penso che questa logica sia necessaria, l'app funzionerà esattamente allo stesso modo se usi 'addToBackStack'. –

+0

Contrariamente al modo in cui tutto il doco sembra indicare l'uso di questi costrutti, anche io sono in grado di ottenere questo funziona come previsto w/l'aggiunta di questo codice in 'OnBackPressed':/ – bc3tech

2

Sono un po 'di tempo ma spero che questo possa aiutare qualcuno.

fragmentTransaction.addToBackStack(null) non funziona se si sta estendendo AppCompatActivity. Funziona bene in Activity. Non ho potuto trovare la ragione.

Problemi correlati