2012-08-25 9 views
26

Ich bin dabei, meine erste App für Android zu machen, und ich habe eine Fragment, die zu meiner Activity in ActivityonCreate() Methode hinzugefügt wird. Das Problem, mit dem ich konfrontiert bin, ist, dass ich keine der Ansichten finden kann, die in der von der ActivityonCreate() Methode enthalten sind.Access Fragment Ansicht von Activity onCreate

Andere Themen haben vorgeschlagen, dass dies daran liegt, dass die Fragment noch nicht aufgeblasen wurde, so findViewById() wird Null für alle Ansichten innerhalb der Fragment zurückgeben. Hier

ist, was ich meine:

Aktivität:

@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"); 
} 

Fragment:

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

Dies druckt die Ergebnisse:

Aktivität onCreate Ende der Tätigkeit onCreate Fragment onCreateView

Aufgrund dieser Ordnung wird jeder Versuch, die Ansichten der Fragment in den Activity zuzugreifen ‚onCreate() Methode s (mit findViewById()) ein NullPointerException, da die Fragment‘ s onCreateView() erst nach dem Ende der Activity ‚s aufgerufen wird, onCreate().

Die Verwendung der FragmentMangerexecutePendingTransactions() nach dem Hinzufügen der Fragment hilft nicht.

Grundsätzlich habe ich onCreateView() das Problem Code in den Activity zu setzen gezwungen 's onStart() Methode statt onCreate(), wie onStart() passiert nach den Fragment ist.

Hat jemand was die Standard-Praxis hier ist, oder wie kann ich meinen Fragment-View-Zugriff Code innerhalb der ActivityonCreate() Methode arbeiten?

+1

Warum möchten Sie auf die 'Fragment'-Ansichten in' activity's 'onCreate()' Methode zugreifen? Etwas stimmt nicht mit deinem Design. – biegleux

+0

Nach dem Hinzufügen eines Fragments in der onCreate() - Methode der Aktivität möchte ich den Text einer TextView, die in dem Fragment enthalten ist, ändern und einige Elemente zu einem Spinner hinzufügen. Was könnte mit meinem Design falsch sein? – Dan

+0

Aktualisieren Sie dann das Layout Ihres Fragments in 'Fragment's' onCreateView() 'Methode. Siehe meine Antwort. – biegleux

Antwort

19

Aktualisieren Sie Ihre Ansichten 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; 
} 

Oder wenn Sie Ihre Änderungen auf Activity hängen Ihre Fragment an, onActivityCreated() verwenden angebracht ist.

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

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

Ok, nach einer Million anderer Probleme, auf die ich nicht eingehen werde, habe ich endlich richtig funktioniert! Danke für Ihre Hilfe. – Dan

+1

@Dan, können Sie genau die anderen Probleme teilen und wie Sie die oben genannten verwendet haben, um es zu lösen? Es wäre ein großer Beitrag der Gemeinschaft. –

+1

Im Grunde versuchte ich onActivityCreated() zu verwenden, um meine Komponenten zu initialisieren, und dachte, dass diese Methode nur einmal aufgerufen würde. Dies verursachte viele Probleme beim Anhalten und Neustarten meiner App, da diese Methode alle meine Komponenten zurücksetzte, da sie jedes Mal aufgerufen wird. Wenn ich dann versuchte, dies mit onCreateView() zu tun, verwendete ich getView(). FindViewById (...), anstatt die bereits initialisierte Variable "view" zu verwenden. Es war ein dummer Fehler, aber ich bin am Ende angekommen! Jetzt wird der Text in onCreate() in einem Feld gespeichert und in onCreateView() in die TextView eingefügt. – Dan

Verwandte Themen