wake-up-neo.com

Unterschied zwischen onCreateView und onViewCreated in Fragment

Was ist der wesentliche Unterschied zwischen diesen beiden Methoden? Sollte ich beim Erstellen einer TextView-Komponente die Leistung über der anderen verwenden?

Edit: Was ist der Unterschied zu

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}
66
Smith

In onCreateView gibt es einige Abstürze beim Initialisieren der Ansicht.

Sie sollten Ihr Layout in onCreateView aufpumpen, aber andere Ansichten nicht mit findViewById in onCreateView initialisieren. 

Weil die Ansicht manchmal nicht richtig initialisiert wird. Verwenden Sie also immer findViewById in onViewCreated (wenn die Ansicht vollständig erstellt wurde) und die Ansicht auch als Parameter übergeben wird.

onViewCreated sorgt dafür, dass die Ansicht vollständig erstellt wird.

36
Xar E Ahmer

onViewCreated wird sofort nach onCreateView (der Methode, die Sie initialisieren und alle Ihre Objekte erstellen, einschließlich Ihrer TextView) aufgerufen. Es ist also keine Frage der Leistung.

Von der Entwicklerseite:

onViewCreated (Ansicht anzeigen, Bundle SavedInstanceState)

Wird unmittelbar nach der Rückkehr von onCreateView (LayoutInflater, ViewGroup, Bundle) aufgerufen, aber bevor ein gespeicherter Status in der Ansicht wiederhergestellt wurde. Dies gibt Unterklassen die Möglichkeit, sich selbst zu initialisieren, sobald sie wissen, dass ihre Ansichtshierarchie vollständig erstellt wurde. Die Ansichtshierarchie des Fragments ist an dieser Stelle jedoch nicht mit dem übergeordneten Element verbunden.

Quelle: Fragment # onViewCreated

32
u3l

Es ist besser, Subviews zu Feldern in onViewCreated zuzuweisen. Dies liegt daran, dass das Framework eine automatische Nullprüfung für Sie durchführt, um sicherzustellen, dass die Ansichtshierarchie Ihres Fragments ordnungsgemäß erstellt und aufgeblasen wurde (wenn Sie eine XML-Layoutdatei verwenden).

Code-Ausschnitt aus: FragmentManger.Java

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}
21
orangemako

onCreateView gibt die aufgeblasene Ansicht zurück. OnViewCreated wird direkt nach onCreateView aufgerufen und hat die aufgeblasene Ansicht. Der Rückgabetyp ist void.

12
Blackbelt

onCreateView() ist das Fragment-Äquivalent von onCreate() für Aktivitäten und führt während die Ansichtserstellung aus.
onViewCreated() führt after die Ansicht wurde erstellt.

should I use one over the other for performance?NEIN. Es gibt keinen Hinweis auf eine Leistungssteigerung.

Tatsächlich gibt es auch in Framents eine onCreate()-Methode.

Aber es ist selten verwendet (ich verwende niemals, finde keinen guten Anwendungsfall dafür).
Ich benutze onCreateView() immer in Fragmenten als Ersatz für onCreate().
Und ich bin glücklich damit.

4
Fantômas

ich denke, der Hauptunterschied zwischen diesen ist, wenn Sie kotlin.in onCreateView () verwenden. Jedes Mal, wenn Sie auf Ihre XML-Datei zugreifen möchten, sollten Sie findViewById verwenden, aber in onViewCreated können Sie Einfach auf Ihre Ansicht zugreifen, indem Sie einfach die ID davon aufrufen. 

2

onCreateView wird in fragment verwendet, um ein Layout zu erstellen und die Ansicht aufzurufen onViewCreated wird verwendet, um auf die mit der obigen Methode ..__ erstellte Ansicht zu verweisen. Schließlich ist es sinnvoll, den Aktionslistener in onActivityCreated zu definieren. 

0
Salu Khadka

Der Hauptgrund, aus dem ich onViewCreated verwenden würde, besteht darin, dass er die Initialisierungslogik von der Inflations-/Erstellungslogik der Ansichtshierarchie trennt, die in die onViewCreate gehen sollte. Alle anderen Leistungsmerkmale sehen gleich aus.

0
AmeyaB