2012-03-20 8 views
5

Ho il seguente problema:Rimuovere Metodo da FragmentTransaction non rimuove frammento da Container

La mia applicazione deve eseguire la navigazione su una tavoletta come segue:

+----+-------+ +----+-------+ +----+-------+ +----+-------+ 
| |  | | |  | | |  | | |  | 
| 1 | 2 | -> | 2 | 3 | -> | 3 | 4 | -> | 4 | ... | 
| |  | | |  | | |  | | |  | 
+----+-------+ +----+-------+ +----+-------+ +----+-------+ 

Ho provato a fare questo navigazione mediante FRAMMENTI, poiché la navigazione è dinamica e non so quanti livelli avrà questa navigazione.

Usando i frammenti API, ho creato la seguente struttura per assistere nei test, chiamando lo stesso frammento più volte:

Se il pannello di sinistra è vuota, inserire il frammento di esso. Se il riquadro sinistro non è vuoto e il riquadro destro è vuoto, inserire il frammento nel riquadro destro. Se i due pannelli non sono vuoti, rimuovere il frammento del pannello destro e sostituire il pannello sinistro e per esso. Quindi inserisci il nuovo frammento a destra.

Il problema è che ho trovato l'errore "Impossibile modificare l'ID del frammento del contenitore" quando provo a eseguire il metodo di sostituzione.

Se si esamina la documentazione per il metodo di rimozione della transazione, sono disponibili le seguenti informazioni: "Rimuovere un frammento esistente. Se è stato aggiunto a un contenitore, anche la relativa vista viene rimossa dal contenitore."

Ma guardando nel frammento del codice API, c'è ancora una variabile che contiene il riferimento al contenitore precedente: mFragmentId.

Qualcuno conosce un modo per eseguire questa navigazione o ripristinare questa variabile?

risposta

2

Credo di avere trovato una soluzione al problema:

Invece di due layout, mi limiterò a usare uno.

L'orientamento di questo layout è orizzontale, quindi i nuovi frammenti verranno aggiunti sempre sul lato sinistro.

Tuttavia, utilizzando il codice seguente:

Frag1 frag1 = new Frag1(); 
frag1.setText("Fragment " + Integer.toString(navigation)); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
if (navigation > 2) { 
    ft.remove(fm.findFragmentByTag("f" + Integer.toString(navigation - 2))); 
} 
ft.add(R.id.Panes, frag1, "f" + Integer.toString(navigation)); 
if (navigation > 1) { 
    ft.addToBackStack(null); 
} 
ft.commit(); 

ho un problema nel BackStack, perché lo stack inserisce il frammento rimosso e rimuovere l'ultimo inserito uno, invertendo l'ordine.

Per risolvere questo problema, ho modificato la transazione rimuovendo per nascondere, ma non so ancora se questo mi darà problemi di prestazioni.

ft.hide(fm.findFragmentByTag("f" + Integer.toString(navigation - 2))); 

Funziona per me.

0

Piuttosto che spostare i frammenti da un contenitore a un altro, scambiare i parametri di layout necessari dei contenitori dei frammenti in modo da ottenere l'effetto visivo desiderato (vale a dire, ciascun contenitore si trova ora al posto dell'altro). Quindi, ogni volta che aggiungi un frammento, esegui anche questo metodo di scambio della posizione del contenitore.

+0

L'ho provato e funziona, ma ho trovato un'altra soluzione utilizzando un solo LinearLayout e mi sembra migliore. Grazie. –

Problemi correlati