Frammenti Android: quando utilizzare nascondi / mostra o aggiungi / rimuovi / sostituisci?


117

Supponiamo che io voglia sostituire il frammento corrente in una vista contenitore con un altro. È meglio usare sostituire ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... o il seguente, con mostra e nascondi?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Un modo per farlo è più efficiente? Non riesco a trovare molte informazioni su quando utilizzare questi metodi o su come influenzano il ciclo di vita dei frammenti coinvolti. Grazie!


se vado al frammento B dal frammento A e poi torno al frammento A come posso assicurarmi che un evento del ciclo di vita come onCreateView non sia chiamato sul frammento A? trova frammento per tag funziona?
blackHawk

Risposte:


135

Dovresti considerare cosa intendi fare con il frammento per decidere quale percorso seguire. Se usi FragmentTransaction per nascondere il frammento, può ancora essere nello stato di esecuzione del suo ciclo di vita, ma la sua interfaccia utente è stata scollegata dalla finestra, quindi non è più visibile. Quindi potresti tecnicamente ancora interagire con il frammento e ricollegare la sua interfaccia utente in seguito, sarà necessario. Se sostituisci il frammento, lo stai effettivamente estraendo dal contenitore e passerà attraverso tutti gli eventi di smontaggio nel ciclo di vita (onPause, onStop, ecc.) E se per qualche motivo avessi bisogno di nuovo quel frammento dovresti farlo inseriscilo di nuovo nel contenitore e lascia che esegua nuovamente tutta la sua inizializzazione.

Se c'è un'alta probabilità che avrai di nuovo bisogno di quel frammento, nascondilo semplicemente perché è un'operazione meno costosa ridisegnare il suo layout piuttosto che reinizializzarlo completamente.


5
Per le nostre esigenze, inizializzare il frammento è piuttosto costoso, quindi probabilmente lo faremo hide()e show()lo salveremo! Grazie per questo!
Robert Karl

2
Ciao, quando dici scollega dalla finestra, intendi che verrà chiamato il callback onDetach ()? L'ho sperimentato, a quanto pare non è così.
GingerJim

probabilmente intendeva "staccare"; un frammento può anche essere staccato / ricollegato (in aggiunta per aggiungere / rimuovere, mostrare / nascondere)
comeGetSome

1
@Zainodis, anch'io ho lo stesso problema. La mia soluzione è salvare lo stato nascosto del frammento in onSaveInstanceState () - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); quindi in onCreate () if (savedInstanceState! = null) recupera lo stato nascosto e se il frammento è nascosto, nascondilo con la transazione.
worawee.s

1
@ worawee.s Ciao e grazie per l'aggiornamento :)! Ho risolto il problema qualche tempo fa da parte mia: non avevo davvero bisogno di nascondere / mostrare ecc. Quindi l'ho completamente abbandonato e ora sto andando con standard come aggiungi / sostituisci o attività di frammento singolo nel riquadro singolo (flusso di dettaglio principale in pratica) . Per coloro che usano ancora hide, la tua soluzione sarà davvero utile - e non controllare savedInstance! = Null è stato uno degli errori che ho fatto prima.
AgentKnopf

5

Fondamentalmente hai risposto a te stesso. Se vuoi sostituire (quindi il vecchio frammento non è più necessario) usa replace()se vuoi nasconderlo temporaneamente, allora fallo hide().


Fondamentalmente sostituire fa removeAll. Non sono riuscito a trovare il nascondiglio corrispondente :(
AlikElzin-kilaka

@ AlikElzin-kilaka Nella mia attività 3 frammento in tutti e tre i frammenti prendo i dati dalla rete quale metodo dovrei seguire
Mansukh Ahir

0

Ho usato il metodo Nascondi / Mostra nella mia attività con 4 frammenti, ha risolto la mia soluzione ma un po 'di tempo in modo casuale quando mostro la mia finestra di dialogo dà un'eccezione al token errato della finestra quando ho usato il metodo aggiungi e sostituisci, quindi l'eccezione del token non valida non si verifica quindi penso che mostri / nascondere il metodo non è perfetto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.