2014-02-14 17 views
6

Ich bin noch neu in der Android-Programmierung, so dass diese Frage eher einfach ist. Ich sehe viele Codebeispiele im Internet, auf denen UI-Komponenten wie TextView initialisiert und in der Methode onCreate() einer Aktivität aufgerufen werden.Android - Aktivität onCreate und Fragment onCreate

Wenn ich Android Studio ein neues Projekt erstellen - FirstApp - mit den Standardeinstellungen, eine so genannte leere Aktivität MainActivity damit activity_main und fragment_main mitbringen, kann ich sofort diese kompilieren in eine APK, stellen Sie es auf meinem Gerät und Ich bekomme einen Bildschirm mit einem Header "FirstApp" und einem TextView in der oberen linken Ecke "Hallo Welt!".

Wenn ich die TextView eine ID von textview1 geben, und erstellen Sie eine Membervariable, TextView myTextView;, dann kann ich es in der onCreate() Methode der Aktivität verweisen, wie so (keine Compiler-Fehler, natürlich):

@Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_main); 
     myTextView = (TextView) findViewById (R.id.textview1); 
     myTextView.setText ("Hello tablet!"); 

     if (savedInstanceState == null) 
     { 
      getSupportFragmentManager().beginTransaction().add (R.id.container,new PlaceholderFragment()).commit(); 
     } 
    } 

Wenn ich jedoch die APK kompilieren und ausführen, führt dies zu einem "Leider hat FirstApp gestoppt." Botschaft.

ich vorher, um dieses Problem bekommen habe von Startcode zu bewegen, die UI-Komponenten in die onStart() Methode der Aktivität greift, etwa so:

@Override 
    protected void onStart() 
    { 
     super.onStart(); 
     myTextView = (TextView) findViewById (R.id.textview1); 
     myTextView.setText ("Hello tablet!"); 
    } 

, die in einem Arbeits APK mit einem einzigen Textview in der Folge hätte oben links zeigt "Hallo Tablet!" - meine einfachen Fragen sind zweifach ...

  1. Wenn das Projekt Fragment verwendet dann soll ich erwarte, dass die UI-Komponenten können nicht in der onCreate() Methode der Aktivität zugegriffen werden können, wie ich sehe, geschah mit vielen Probe Code im Internet, wahrscheinlich weil sie noch nicht erstellt wurden?
  2. Ist es akzeptabel für mich, Zugriff auf UI-Komponenten innerhalb der onStart() Methode der Aktivität (die funktioniert Arbeit) - oder sollte ich etwas anderes tun? Früher habe ich auch die onCreateView Methode des Fragments verwendet, aber ist der beste Ort, um UI-Komponenten innerhalb eines Fragments tatsächlich in der onCreate() Methode des Fragments zuzugreifen, die ich noch nicht ausprobiert habe?

Ich stelle auch fest, dass die onCreate() Methode des Standard-Fragment Android Studio für Sie erstellt, wenn Sie ein neues Projekt an einen Stub gemachten Angaben nicht ... aber onCreateView der Fall ist, und die Lifecycle-Dokumentation impliziert (für mich, jedenfalls) dass dieser könnte der beste Ort sein, Dinge wie diese zu tun.

Alle Hinweise dazu sind willkommen.

+0

Wenn es abgestürzt ist, holen Sie sich den Logcat StackTrace, damit wir sehen können, wo der Fehler liegt. Auch wird 'myTextView' irgendwo anders aufgebaut, zB' TextView myTextView; '? –

+0

Sie sollten über Fragmente im Allgemeinen lesen. 1. Die Ansicht des Fragments ist noch nicht verfügbar (es ist keine einfache Ansicht, die Sie dem Layout hinzufügen). 2. Sie können auf die Ansichten von dem gewünschten Callback zugreifen ('onCreate()' wird im Allgemeinen bevorzugt). Das Problem besteht darin, dass Sie versuchen, auf die Ansicht des Fragments zuzugreifen, die Sie vermeiden sollten, und stattdessen das Fragment selbst behandeln lässt. – Luksprog

+0

@Tom Hart - Ja, 'TextView myTextView;' ist als Membervariable enthalten. Bezieht sich Ihre Antwort darauf, dass Sie denken, dass diese UI-Komponente * in der Methode 'onCreate() 'der Aktivität selbst perfekt zugänglich sein sollte? – Hippogriff

Antwort

7

Der Fragment-Transaktion-Commit-Befehl setzt die Transaktion nur in Que - die Transaktion wird in der Zukunft verarbeitet. Dies ist, warum Sie es nicht direkt von erstellen können.

Ich empfehle Ihnen, Fragmente zu verwenden, um ihr Ui-Verhalten einzukapseln - ich würde die Ui-Elemente eines Fragments nicht explizit von der Aktivität ändern.

OnCreateView innerhalb eines Fragments ist ein guter Ort, um die Ui-Elemente des Fragments zu initialisieren, da es aufgerufen wird, wenn die Fragmentansicht erstellt wird.

Die Arbeit mit Fragmenten ist ziemlich schwierig und schmerzhaft am Anfang, aber von meiner Erfahrung helfen sie, einen viel mehr modularen Code zu erstellen.

Ich schlage vor, Sie lesen mehr über Fragmente in den Dokumenten, bevor Sie ein ernstes Projekt mit ihnen beginnen. http://developer.android.com/guide/components/fragments.html

+0

Danke ... ja, Zugriff auf UI-Komponenten in einem Fragment während der 'onCreateView' Methode ** funktioniert ** gut, solange ich' rootView.findViewById' verwende - Ich habe entdeckt, dass ich nicht verstehe, wie ich würde versuche sogar, auf eine UI-Komponente in der 'onCreate'-Methode eines Fragments zuzugreifen, weil ich anscheinend keinen Zugriff auf einen' Container 'habe, etwas, das offensichtlich an' onCreateView 'weitergegeben wird und für das' inflate 'verfügbar ist 'Methode. – Hippogriff

+0

P.S. - Ist es in Ordnung, wenn ich nur hinzufüge, dass ich mich nicht genau für die Verwendung von Fragmenten per se entschieden habe, Android Studio gewählt habe und Android Studio versucht, die Verwendung von Fragmenten zu erzwingen und zu erzwingen? , indem Sie beim Erstellen eines neuen Projekts eine angeben. Das ist keine schlechte Sache ... Ich muss nur die Dinge richtig verstehen, da viele Codebeispiele, die man im Internet sieht, keine Fragmente verwenden, daher stieß ich auf Probleme mit einfachen Dingen. Vielen Dank! – Hippogriff

+0

Die neue Version von Android Studio ermöglicht es Ihnen jetzt, ein neues Projekt * ohne * ein Standard-Fragment zu erstellen, und für die Apps, die ich erstelle, scheint dies eine gute Sache für mich zu sein, so dass es die Dinge ein bisschen einfacher macht. – Hippogriff

0

@ Chipopo ist richtig in der Diagnose und in den Einkapselungsempfehlungen.

Aber falls Sie brauchen, können Sie FarmentManager.executePendingTransactions() nach der Durchführung der Transaktion aufrufen. Dies stellt sicher, dass die Operationen an der Fragmentwarteschlange synchron ausgeführt werden. Ich benutzte das manchmal in Nicht-UI-retainedInstance-Fragmenten.

Verwandte Themen