2012-07-09 23 views
38

Ciao, stavo guardando il seguente esempio di Frammenti sul sito di Android.Qual è il punto di setArguments?

http://developer.android.com/guide/components/fragments.html#Example

Vorrei sapere perché vengono eseguiti certi metodi.

Perché, per esempio, nel detailsFragment è il seguente metodo eseguito:

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

Non potresti anche semplicemente istanziare il DetailsFragment e utilizzare un metodo setter per impostare index invece. Bypassare l'intero setArguments.

Qual è il punto di utilizzo di setArguments in primo luogo? Non potresti usare solo setter e getter?

+3

Recentemente è diventato comune che le funzionalità di base di un'applicazione siano incapsulate in 'Fragments', e quindi che' Activities' gestisca essenzialmente la disposizione delle schermate (e la navigazione tra) composte da detti frammenti. Con un 'Activity', puoi passare un' Bundle' di extra in un intento e avere accesso a questo fin da subito con 'onCreate()'. 'Fragments' non risponde alle intenzioni, quindi puoi usare' setArguments() 'per fornirgli un' Bundle' "di extra" prima che venga creato. – Karakuri

+0

@Karakuri grazie che è utile sapere. – HGPB

+1

Dai un'occhiata a questo: http://stackoverflow.com/a/7160253/334493 –

risposta

36

È possibile utilizzare getter e setter, ma passando un bundle non è necessario scrivere quel codice, poiché è già lì. Inoltre, credo che questi argomenti vengano automaticamente passati di nuovo se l'orientamento dello schermo cambia, il che rende anche la vita più facile.

In sostanza, setArguments e getArguments è solo un modello di progettazione che Google suggerisce di seguire:

ogni frammento deve avere un costruttore vuoto, in modo che possa essere un'istanza per il ripristino dello stato di sua attività. Si consiglia fortemente a di non avere altri costruttori con i parametri , poiché questi costruttori non verranno chiamati quando il frammento viene riattivato; invece, gli argomenti possono essere forniti dal chiamante con setArguments (Bundle) e successivamente recuperati dal Frammento con getArguments(). http://developer.android.com/reference/android/app/Fragment.html

prendo quella di includere setter che sono necessari per la vostra Frammento di operare pure. Poi di nuovo - non c'è niente che ti costringa a farlo in questo modo, e come sai - non è l'unico modo per far funzionare le cose.

+0

Roba buona, solo due modi diversi per fare lo stesso lavoro - bene. Il secondo punto rende l'uso di setArguments prezioso semplicemente usando setter e getter se ciò è vero. In questo caso non sono sicuro che farebbe alcuna differenza però. Ma potrei sbagliarmi. – HGPB

+0

Come su due costruttori; uno vuoto e uno che accetta lo stato iniziale del frammento. Un frammento può quindi utilizzare il pacchetto passato in onSaveInstanceState() e onCreate() per mantenere lo stato dell'istanza? –

+0

Glenn, normalmente quello che faccio è un metodo getInstance (..) statico che crea un bundle con tutti gli argomenti e usa setArguments() su una nuova istanza del frammento. In questo modo hai un semplice "costruttore" da chiamare, gli argomenti vengono impostati e Android ha un simpatico costruttore vuoto che può utilizzare internamente. –

23

Solo per aggiungere alla risposta di Matthew: ha citato correttamente che Frammenti hanno bisogno di avere un costruttore vuoto, in modo che il framework possa riattivarli quando necessario.

È corretto utilizzare getter e setter, ma poiché il framework può distruggere e ricreare il frammento, è necessario assicurarsi di non perdere tali parametri.

Questo deve essere effettuato tramite Fragment.onSaveInstanceState(). I dati salvati verranno restituiti come parametro savedInstanceState in Fragment.onCreate(), Fragment.onCreateView() e diversi altri metodi.

L'utilizzo di Fragment.setArguments() è (nella maggior parte dei casi, presumo) più semplice, in quanto il framework preserverà automaticamente gli argomenti e quindi farà la maggior parte del lavoro per voi.

I setter possono essere la strada da percorrere per i parametri che si forniscono inizialmente al frammento e che il frammento può regolare nel tempo. Affrontare la storedInstanceState da solo può essere più semplice in questo caso che occuparsi di savedInstanceState e degli argomenti - dove devi prendere una decisione che è il parametro valido.

+4

Questo è un aspetto di fondamentale importanza della comprensione di Frammenti che ritengo possa essere grottescamente sottoc documentato. La tua risposta fornisce alcune informazioni. Se non si desidera utilizzare setArguments e si desidera utilizzare un setter, è necessario utilizzare onSaveInstanceState o Android non sarà in grado di inizializzare nuovamente il frammento? Cribbio! – rmirabelle

+3

@rmirabelle L'underdocumentation sembra essere il mio caso per molti casi in Android, sfortunatamente. Ho scoperto un sacco di casi che non sono né possibili né problematici e che non sono affatto documentati o solo come nodo laterale da qualche parte o stackoverflow/gruppi di google rispondono da qualche parte. – sstn

5
public void setArguments (Bundle args) 

rifornimento gli argomenti di costruzione di questo frammento. Questo può essere solo chiamato prima che il frammento sia stato allegato alla sua attività; ovvero, dovresti chiamarlo subito dopo aver costruito il frammento. I argomenti forniti qui sarà trattenuto tutta frammento distruggono e creazione(può essere il testo in grassetto mancava da documentazione ufficiale in precedenza)

Fragments.setArguments(Bundle args)

+0

Grazie. Hai confermato questo punto critico fornendo la documentazione pertinente. – stevehs17

0

In setter aggiunta possono essere oggetto di abuso . Se updateSomeOtherStuff() cambierà qualche vista, questo si bloccherà.

public class MyFragment extends Fragment { 
    void setData(someData){ 
     this.someData = someData; 
     updateSomeOtherStuff() 
    } 
} 

Se si passa in un pacco che non è possibile abusare il setter e sarà sempre sapere che questo sarà fissato entro i metodi del ciclo di vita.