2013-03-07 8 views
15

Sto convertendo tutte le mie attività in frammenti in modo che possa essere utilizzato in un ViewPager.Android: dove inserire il codice onCreate() di un'attività in un frammento?

Ho cercato questo, ma non ho trovato una risposta soddisfacente, ecco perché lo sto chiedendo qui.

Nella mia attività, ho scritto del codice nel metodo onCreate(). Per esempio, chiamo alcuni findViewById() s per collegare alcuni pulsanti xml alla mia attività. Rendo invisibili alcune viste nello onCreate(), impostiamo un OnClickListener(), inseriamo un TextView con il testo e rimuoviamo una notifica, il tutto nel metodo onCreate().

La mia domanda è: dove devo inserire questo codice nel frammento? Nel onCreate()? onCreateView()? onActivityCreated()? e perché?

Molte grazie in anticipo!

risposta

19

Anche se la risposta di Pragnani è vicina, c'è poco valore educativo in esso. Inoltre, c'è un'opzione più appropriata alla sua seconda affermazione.

Dove devo inserire questo codice nel frammento? Nel onCreate()? onCreateView()? onActivityCreated()? e perché?

La risposta breve è: o onCreateView() o onActivityCreated(). La gerarchia della vista non verrà creata fino al onCreateView(), quindi è il primo punto del ciclo di vita del frammento che è possibile gonfiare le viste e allegare listener di clic ecc. Since onActivityCreated() will always be run after onCreateView(), anche questa è una posizione adatta. onCreate() può essere saltato in favore del sistema che stacca temporaneamente il frammento e lo ricollega, ad es. quando retaining fragments.

Pragnani ha ragione sottolineando che gonfiare le viste di un frammento è leggermente diverso dal gonfiare le viste in un'attività. Più precisamente: un frammento non definisce un metodo findViewById(), quindi dovrai chiamarlo su qualche altro oggetto.

Invece di utilizzare getActivity().findViewById(), è necessario getView().findViewById(). Il motivo è che se si utilizza l'attività per le ricerche della vista, si avranno dei problemi quando a esso sono collegati più frammenti con gli stessi ID di vista. Questo è il caso se riutilizzi gli ID di vista nei layout dei vari frammenti o se mostri due frammenti identici che visualizzano dati diversi. In entrambi i casi, verrà restituita solo la prima corrispondenza, mentre si desidera realmente che la vista venga visualizzata nel seguito del frammento. Questo è esattamente ciò che restituisce getView(), la vista radice del frammento (che è stata restituita in onCreateView()) e limita quindi l'ambito della ricerca in modo appropriato.

+0

Grazie mille per la tua risposta completa! Questo è esattamente quello di cui avevo bisogno! – Xander

+0

Non riesco a chiamare 'getView()' in 'onCreateView()', mi dà una NullPointerException – Xander

+0

Questo è corretto: 'getView()' non sarà impostato fino a quando 'onCreateView()' ritorna - forse avrei dovuto farlo più esplicito. Tuttavia, dal momento che stai gonfiando la vista root in 'onCreateView()', non dovresti chiamare 'getView()', ma invece chiama direttamente 'findViewById()' sulla vista che stai per restituire. Per un esempio: vedere ['CountingFragment'] (http://developer.android.com/reference/android/app/Fragment.html#BackStack). –

3

1. Sinistra onCreate vuota e basta chiamare super.onCreate()

2. Invece di findViewById() utilizzare getActivity(). FindViewById() sempre utilizzare getActivity() dove è necessario contesto della vista.

Do all other operations in onCreateview() 
+0

Completamente contrario a ciò che questo documento https://github.com/thecodepath/android_guides/wiki/Creating-and-Using-Fragments dice – tsil