2013-09-25 10 views
7

Mi interessa il modo migliore per avere una singola attività che passi da un frammento all'altro.Il modo migliore per passare da un frammento all'altro

Ho letto probabilmente 15 post di Stack Overflow e 5 post di blog su come eseguire questa operazione, e, mentre penso di aver messo insieme una soluzione, non sono convinto che sia la migliore. Quindi, voglio sentire le opinioni delle persone sul modo corretto di gestirle, specialmente per quanto riguarda il ciclo di vita dell'attività dei genitori e dei frammenti.

Ecco la situazione nel dettaglio:

  1. Un'attività genitore che può visualizzare uno dei due possibili frammenti.
  2. I due frammenti dichiarano che mi piacerebbe persistere in una sessione, ma non necessariamente deve essere persistente tra una sessione e l'altra.
  3. Un numero di altre attività, in modo tale che l'attività principale e i frammenti potrebbero essere sepolti nello stack posteriore e distrutti a causa della memoria insufficiente.
  4. Voglio la possibilità di usare il pulsante Indietro per spostarsi tra i frammenti (Quindi, a quanto ho capito, non posso usare setRetainInstance).

Oltre ai consigli generali architettura, ho il seguente questioni in sospeso:

  1. Se l'attività genitore viene distrutto a causa della scarsa memoria, come faccio a garantire che gli stati di entrambi i frammenti saranno conservate , come da questo post: When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?. Ho solo bisogno di un puntatore a ciascun frammento dell'attività genitore?
  2. Qual è il modo migliore per l'attività padre di tenere traccia di quale frammento è attualmente visualizzato?

Grazie in anticipo!

risposta

6

Ho finito per aggiungere entrambi i frammenti utilizzando il gestore dei frammenti di supporto e quindi utilizzando staccare/collegare per passare da uno all'altro.Sono stato in grado di utilizzare commitAllowingStateLoss() perché mantengo lo stato della vista altrove e setto manualmente il frammento corretto in onResume().

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

Si potrebbe prendere in considerazione l'utilizzo di un ViewPager nell'attività padre in modo da poter passare tra i frammenti.

Quindi sarebbe in grado di scorrere attraverso di loro.

se si desidera mantenere il proprio stato durante una sessione anche se l'attività padre viene distrutta, è necessario renderli Parcelable, in modo da poter salvare lo stato anche se la classe non è istanziata in quel momento. È inoltre necessario eseguire questa operazione se si ruota il dispositivo e si desidera mantenere la situazione/i dati correnti sullo schermo.

Si dovrebbe scrivere su un Parcelable nelle loro metodi e ricrearli da esso nel onResume uno. In questo modo non importa se vengono distrutti o devono essere ricreati a causa di cambiamenti nell'orientamento dei dispositivi.

se si desidera poter commutare tra questi frammenti con il pulsante Indietro, è possibile prendere il pulsante per onBackPressed e gestirlo di conseguenza.

Se hai bisogno di capire quale Frammento stai visualizzando in un dato momento chiedi al tuo ViewPager quale Frammento sta visualizzando in quel momento, quindi non devi tenere traccia, puoi solo chiedere a qualcuno che lo sa, se devi saperlo.

+0

Grazie per la risposta. Non penso di poter utilizzare un visualizzatore di immagini qui, perché le viste non dovrebbero essere trascinate. Io sicuramente implementerò parcelable però. Dove posso implementare suBackPressed? – GLee

+0

OnBackPressed è un metodo di un'attività. Quindi dovrai scavalcarlo lì. –

Problemi correlati