2012-08-25 10 views
26

Sono in procinto di creare la mia prima app per Android, e ho un Fragment che viene aggiunto al mio Activity nel metodo . Il problema che sto affrontando è che non sono in grado di trovare nessuna delle viste contenute all'interno dello Fragment dal metodo Activity.Visualizza frammento di accesso da ActivityCreate

Altre discussioni hanno suggerito che ciò è dovuto al fatto che lo Fragment non è stato ancora gonfiato, pertanto findViewById() restituirà null per qualsiasi vista contenuta all'interno dello Fragment.

Ecco cosa intendo:

attività:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.out.println("activity onCreate"); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) { 
     return; 
    } 

    initialiseUI(); // Fragment added to Activity 

    System.out.println("end of activity onCreate"); 
} 

Frammento:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
System.out.println("fragment onCreateView"); 
    return inflater.inflate(R.layout.event_log, container, false); 
} 

Questo stampa i risultati:

attività onCreate fine dell'attività onCreate frammento onCreateView

A causa di questo ordine, qualsiasi tentativo di accedere alle visualizzazioni del Fragment nella Activity 'metodo s onCreate() (usando findViewById()) produce un NullPointerException, come Fragment' s onCreateView() solo viene richiamato dopo la fine degli s ActivityonCreate().

L'utilizzo dello FragmentManger di executePendingTransactions() dopo l'aggiunta di Fragment non è di aiuto.

Fondamentalmente, sono stato costretto a mettere il codice problema nel Activity 'onStart() metodo anziché onCreate() s, come onStart() accade dopo la Fragment' s onCreateView().

Qualcuno qual è la pratica standard qui o il modo in cui posso far funzionare il mio codice di accesso alla vista frammento nel metodo onCreate()Activity?

+1

Perché si desidera accedere alle viste di 'Fragment' nel metodo' suCreate() 'di Activity? Qualcosa non va nella tua scelta. – biegleux

+0

In particolare, dopo aver aggiunto un frammento nel metodo onCreate() di Activity, voglio cambiare il testo di una TextView contenuta all'interno del Fragment e aggiungere alcuni elementi a uno Spinner. Cosa potrebbe esserci di sbagliato nel mio design? – Dan

+0

Aggiorna il layout del tuo frammento nel metodo 'Fragment' su onCreateView()'. Vedi la mia risposta. – biegleux

risposta

19

Aggiorna le visualizzazioni in onCreateView().

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.event_log, container, false); 
    TextView tv = (TextView) view.findViewById(R.id.text); 
    tv.setText("hello world"); 
    return view; 
} 

O se le modifiche dipendono Activity tuo Fragment è collegato a, utilizzare onActivityCreated().

@Override 
public void onActivityCreated (Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    TextView tv = (TextView) getView().findViewById(R.id.text); 
    tv.setText(getActivity.getSomeText()); 
} 
+0

Ok, dopo un milione di altri problemi che non entrerò, finalmente ho funzionato correttamente! Grazie per l'aiuto. – Dan

+1

@Dan, puoi condividere esattamente gli altri problemi e come hai usato quanto sopra per risolverlo? Sarebbe un grande contributo della comunità. –

+1

Fondamentalmente, ho provato a utilizzare onActivityCreated() per inizializzare i miei componenti, pensando che questo metodo sarebbe stato chiamato una sola volta. Ciò ha causato molti problemi durante la pausa e il riavvio della mia app, poiché questo metodo stava ripristinando tutti i miei componenti, dal momento che viene chiamato ogni volta. Quindi, quando ho provato a fare questo lavoro usando onCreateView(), ho usato getView(). FindViewById (...) piuttosto che usare la variabile "vista" già inizializzata. È stato uno stupido errore, ma alla fine ci sono arrivato! Così ora il testo viene archiviato in un campo in onCreate() e inserito in TextView in onCreateView(). – Dan

Problemi correlati