2012-01-07 3 views
44

Activity layout pictureCome richiamare lo stack per Attività con più Frammenti?

Si supponga che ho un'attività che contiene due FrameLayouts (chiamiamoli SeqA e SeqB), che a sua volta ogni contengono un frammento (chiamiamoli FragmentA1 e FragmentB1 rispettivamente). Ora, ho commesso una serie di singole operazioni frammento utilizzando codice simile al seguente ...

getFragmentManager() 
.beginTransaction() 
.replace(frameId, fragment) 
.addToBackStack(null) 
.commit(); 

... tale che sostituisco FragmentA1 in SeqA con FragmentA2, allora sostituisco FragmentB1 in SeqB con FragmentB2, poi ho Sostituisci FragmentA2 in FrameA con FragmentA3, quindi sostituisco FragmentB2 in Frame2 con FragmentB3, e lo stato finale assomiglia all'immagine sopra (dove sono visibili solo FragmentA3 e FragmentB3).

Se ho capito correttamente come funziona il back stack, premendo 'indietro' si alternano i popping dei Fragments tra FrameA e FrameB (riflettendo come li ho aggiunti).

Qualcuno sa se è possibile inserire selettivamente l'ultima transazione su FrameA o FrameB? (Cioè se ho premuto 'Pop SeqA' quindi SeqA sarebbe la transizione di ritorno da FragmentA3 a FragmentA2 e, invece, se ho premuto 'Pop SeqB' quindi SeqB sarebbe la transizione di ritorno da FragmentB3 a FragmentB2)

Supplemento: So che posso ottenere l'ultimo frammento aggiunto a un FrameLayout specificato utilizzando il metodo FragmentManager.findFragmentById(int framelayoutId), ma chiamando lo FragmentTransaction.remove(fragment).commit() rimuove solo il frammento dalla vista e non passa nuovamente la vista al frammento visualizzato in precedenza.

+1

Se FragmentTransaction.remove "rimuove solo il frammento dalla vista e non la transizione View", allora che cosa sta mostrando in la vista? Ma posso capire perché questo potrebbe causare confusione se Mgr conserva una singola pila di frammenti ma non è a conoscenza di quali sono simultaneamente visibili, cioè, come potrebbe sapere che A2 è "sotto" A3 quando B2 potrebbe trovarsi tra di loro sul pila? – gordonwd

+0

Se una vista (FrameLayout nel mio caso) ha aggiunto più Frammenti usando il metodo 'FragmentTransaction.add (int, Fragment)', quindi chiamando 'FragmentTransaction.remove (Fragment) .it()' Credo che lascerà il FrameLayout mostra l'ultima Fragment aggiunta ad essa. Tuttavia, aggiungendo Frammenti alla Vista usando il metodo 'FragmentTransaction.replace (int, Fragment)' (come sto facendo, supponendo che questo sia meglio per la memoria ?!) lascerà il FrameLayout senza figli (cioè mostrando come Vista vuota) ... –

+0

Per aggiungere al mio commento precedente: Vedo che ci sono alcuni metodi utili come 'FragmentManager.getBackStackEntryAt (int index)', 'FragmentManager.popBackStack (String name, int flags) ',' popBackStack (int id, int flags) ',' FragmentTransaction.addToBackStack (String name) 'e' FragmentTransaction.replace (int containerViewId, Fragment fragment, String tag) ', non sono sicuro come riunirli insieme per ottenere quello che mi serve ... –

risposta

22

Fondamentalmente, no, c'è solo uno stack indietro per un'attività.

Dovrai solo implementare i tuoi back stack separati.

A partire da Android 4.0 (e la relativa libreria di supporto) ci sono API che dovrebbero renderlo relativamente facile - FragmentTransaction.detach(Fragment) consente di inserire un frammento nello stesso stato in cui si trova nello stack posteriore e FragmentManager.saveFragmentInstanceState(Fragment) consente di andare oltre e getta via completamente l'oggetto Frammento. Non a caso, questi sono utilizzati per implementare rispettivamente FragmentPapersapter e FragmentStatePagerAdapter di ViewPager in modo da poter vedere il codice come esempio di come utilizzarli.

+0

Grazie per la risposta Hackbod. Ho dovuto fare progressi con quello che sapevo, quindi ho implementato una soluzione in cui ho nascosto il frammento A1 prima di _adding_ (piuttosto che _replacing_) il frammento A2 sopra di esso, e poi _showing_ Fragment A1 di nuovo quando viene rimosso il frammento A2. Sta funzionando per me, ma sicuramente andrò ad implementare i miei back stack come hai descritto nei progetti futuri o se qualsiasi comportamento indesiderato emerge in quello attuale: - Grazie ancora. –