2011-10-23 18 views
8

Vorrei implementare un design Multi-Fragments a singola attività nella mia app. Ho in programma di avere diverse "schermate" (layout di Fragment) che potrò passare (eventualmente aggiungendo allo stack) nel codice.Android - Cambia layout frammento in runtime

A mio parere, il layout dei frammenti in ogni schermata è impostato utilizzando gli oggetti Layout (ad esempio FrameLayout), che fungono da segnaposto per i frammenti (condividendo lo stesso ID). Dal momento che schermi diversi hanno arrangiamenti Fragment diversi (uno potrebbe essere FrameLayout, e un altro LinearLayout, ecc.) Mi stavo chiedendo: come posso passare da un layout all'altro di un frammento in runtime?

Capisco di aggiungere/sostituire Frammenti (tramite FragmentManager), ma mi piacerebbe aggiungere completamente un nuovo layout che li contiene, all'interno di un'attività dal vivo. Un po 'come avere transazioni per "setContentView" ...

Come faccio a fare questo? Grazie! Danny.

+0

Ho inserito il codice multi-frammenti di attività singola qui: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391 # 7799391 – user999717

+0

Grazie per la rapida risposta. Tuttavia, penso che il passaggio tra i frammenti nello stesso layout come mostra il tuo esempio ('R.id.mainframe'), non risolva il mio problema, che è come passare da un layout all'altro di un frammento. Specialmente se i layout sono creati in codice (dopo che onContentView è stato chiamato), come nel mio caso. – DannyA

+0

Oh capisco, quindi vuoi ri-genitorare i frammenti esistenti senza re-istanziarli? Interessante. – user999717

risposta

4

È certamente possibile, l'unica cosa che devi fare è generare i tuoi ID. Gli ID possono essere qualsiasi cosa ma non devono essere in conflitto con gli ID di aapt (quelli in R) e non devono essere negativi.

L'esempio seguente dimostra questo con una serie di ID fissi:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

Per passare a un layout diverso, è possibile rimuovere i frammenti e aggiungerli altrove.
Fammi sapere come va.

MODIFICA: per chiarire, le viste e i gruppi di vista non devono essere istanziati una volta e quindi conservati per la durata dell'attività. Assicurati che tutti i frammenti vengano rimossi o rimossi prima di rimuovere la vista associata. Inoltre, se crei e rimuovi viste al di fuori di onCreate dovresti assicurarti che possa essere ripristinato usando onSaveInstanceState e ripetendo il processo in onCreate. Leggi il diagram here e il paragrafo su configuration changes.

+0

Grazie per lo sforzo! Dato che sono un principiante di Android, voglio assicurarmi di aver capito bene - è giusto aggiungere/rimuovere viste e layout dalla vista principale della mia attività praticamente ovunque nel mio codice, e non solo nel onCreate (I non credo di aver visto esempi per questo), e quindi creare e aggiungere frammenti a loro al volo? È un po 'più che "rimuovere i frammenti e aggiungerli altrove", perché creo un nuovo layout per loro. – DannyA

+0

L'obiettivo è infine quello di separare questa logica del frammento in classi diverse per lo "schermo" e di far sì che ogni classe conosca i propri ID di layout e inserisce i propri frammenti in essi. Quindi posso navigare da una "schermata" all'altra tramite transazioni di frammenti. per esempio. nascondi tutti i frammenti della schermata precedente e mostra invece i nuovi frammenti. Devo ammettere che questa tecnica mi sembra un po 'strana, perché inonderà la mia attività di layout vuoti con frammenti invisibili ... Sembra che il mio obiettivo sia ragionevole ma non ho trovato il disegno corretto per questo. – DannyA

+0

Beh, questo è un interessante ragionamento, ma non è esattamente questo il motivo per cui sono state fatte le attività e il loro metodo startActivity (Intent)? Puoi anche recuperare la funzionalità dei pulsanti gratuitamente. – user999717

Problemi correlati