2013-02-11 16 views
13

questa è la funzione responsabile per l'aggiunta di frammenti di eseguire stack:Android - addToBackStack() non funziona?

public void populateContent(File f) 
{ 

    ContentFragment cf = new ContentFragment(ctx, ac, this); 
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; 
    cf.updateView(f); 

    transaction.replace(R.id.contentFragment, cf); 

    transaction.addToBackStack(null); 

    transaction.commit(); 

} 

Quando clicco il tasto indietro, l'ultimo frammento non vengono caricati (non succede niente).

Qualche idea di cosa potrebbe causare questo?

Modifica: registro FragmentManager.

http://pastebin.com/mYnVdkLG

Mi sembra come se la mia domanda sta salvando il secondo punto di vista due volte, invece di salvare il primo e poi il secondo punto di vista.

+0

penso che si dovrebbe addtobackStack() e poi sostituire il frammento ... – user1969053

+0

Questo non lo ha risolto. – Tool

+0

Guarda questa risposta: http://stackoverflow.com/a/14030872/1484779 – jlopez

risposta

11

Non sono sicuro della soluzione ma posso guidarti un po 'e forse puoi capire qual è il problema.

In realtà stai sostituendo due frammenti? Se non lo fai, non c'è nessuna transazione da ripristinare. Inoltre è il tuo primo Fragment aggiunto da XML? Il gestore non conoscerà questo frammento e potrebbe essere necessario aggiungere il primo Fragment utilizzando anche una transazione.

Prestare attenzione a verificare if (savedInstanceState == null) performFirstTransaction() altrimenti si finirà per aggiungere il primo Fragment due volte.

Una buona idea è quella di utilizzare enableDebugLogging nello FragmentManager. Questo ti indicherà quali frammenti il ​​manager conosce.

vedere questo: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

Come nota a margine, non è raccomandato l'uso di un costruttore personalizzato per il vostro Fragment. Questo perché se la tua app viene uccisa e riattivata dal SO, chiamerà il costruttore vuoto.

È necessario utilizzare un metodo statico come ContentFragment.getInstance(<params>) per creare il numero Fragment.

Vedere ulteriori informazioni su: http://developer.android.com/reference/android/app/Fragment.html nella sezione "Panoramica classe".

Spero che la mia risposta ti aiuti un po 'a trovare il problema.

+0

Posso mostrarti i log di FragmentManager, forse aiuteranno. – Tool

+0

Inoltre, non ho un costruttore personalizzato per il mio frammento - non l'ho modificato. Tuttavia, ho un metodo nel frammento che funge da aggiornamento della vista. – Tool

+0

Ok, ho pubblicato il collegamento al registro dal Gestore. – Tool

51

Sembra che chiamare addToBackStack() sulla transazione dei frammenti non sia sufficiente, dobbiamo gestire l'apertura dello stack posteriore sul pulsante Indietro premuto da noi stessi. Ho aggiunto questo per la mia attività e ha funzionato come previsto:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+3

Funziona ma non riproduce l'animazione. MODIFICA: se vuoi riprodurre l'animazione sul popbackstack, aggiungi due parametri extra quando chiami setCustomAnimation. Vedi [qui] (http://stackoverflow.com/questions/25485822/android-pop-fragment-from-backstack-with-animation). – Nathan

+2

Funziona bene. È sorprendente che dobbiamo gestirlo da soli perché suppongo che la documentazione affermi che ciò avverrà automaticamente. – Ankit

+0

se questo è documentato in qualche modo? – Defuera

2

stavo aggiungendo, non in sostituzione, ma ho dovuto chiamare addToBackStack (null) prima di add(), non dopo, sul frammento che si chiuderà, non sul frammento che rimarrà aperto.

in classe A (aperto prima)

FragmentTransaction ft = fm.beginTransaction(); 
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 

In classe B (aperto da classe A)

FragmentTransaction ft = fm.beginTransaction(); 
ft.addToBackStack(null); 
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 
+0

addToBackStack quando si esegue l'aggiunta/sostituzione del frammento è ciò che ha fatto per me. – Clocker

+0

* "chiama addToBackStack (null) prima di add(), non dopo" * Questo è esattamente il mio problema. Mi hai risparmiato un sacco di mal di testa. Grazie! –

Problemi correlati