Różnice i zastosowania onCreate (), onCreateView () i onActivityCreated () we fragmentach

329

Jakie są różnice między onCreate(),onCreateView() i onActivityCreated()we fragmentach i co one być stosowane dla każdego?

Farbod Salamat-Zadeh
źródło
Zobacz także: stackoverflow.com/questions/27227906/…
Brad Larson
@BradLarson Nie rozumiem, dlaczego to zostało zamknięte. Okazało się, że jest to dość popularne pytanie i różni się od linku podanego w komentarzu. To pytanie dotyczy różnicy między trzema różnymi metodami i tego, jak się ze sobą porównują, ale pytanie, które podałeś w komentarzu, wymienia tylko dwie z tych metod.
Farbod Salamat-Zadeh
@BradLarson Wystarczająco i dobrze zauważony. Teraz, gdy już rozumiem, czy nie mogę napisać odpowiedzi, która lepiej porównywałaby trzy metody, odwołując się do linków w celu uzyskania dodatkowych informacji?
Farbod Salamat-Zadeh
2
@ FarbodSalamat-Zadeh - Jasne. Ponownie otworzyłem pytanie, jeśli uważasz, że możesz udzielić lepszej odpowiedzi. Po prostu nie chciałem zostawić go bez odpowiedzi, gdybym mógł.
Brad Larson

Odpowiedzi:

394

onCreate ():

onCreate()Metodę w Fragmentjest nazywany po Activity„sonAttachFragment() Ale zanim to Fragment” s onCreateView().
W tej metodzie możesz przypisywać zmienne, uzyskiwać Intentdodatki i wszystko inne, co nie wiąże się z hierarchią widoku (tj. Nie graficzne inicjalizacje). Wynika to z faktu, że tę metodę można wywołać, gdy ActivityjestonCreate() nie jest zakończona, a więc próbuje uzyskać dostęp do widoku Hierarchia tutaj może doprowadzić do katastrofy.

onCreateView ():

Po onCreate()nazywa (w Fragment), przy czym Fragment„a onCreateView()jest tzw. Możesz przypisać Viewzmienne i wykonać dowolną graficzną inicjalizację . Oczekuje się, że zwrócisz Viewz tej metody, a to jest główny widok interfejsu użytkownika, ale jeśli takFragment nie używasz żadnych układów ani grafiki, możesz zwrócićnull (domyślnie dzieje się, jeśli nie zastąpisz).

onActivityCreated ():

Jak nazwa wskazuje, jest to nazywane po Activity„s onCreate()zakończył . Jest wywoływany po onCreateView()i jest używany głównie do końcowych inicjalizacji (na przykład do modyfikowania elementów interfejsu użytkownika).


Podsumowując ...
... wszyscy są wzywani, Fragmentale są wywoływani w różnych momentach. Nazywa się pierwszy, za to żadnych Initialisations niegraficznych. Następnie możesz przypisać i zadeklarować dowolne zmienne, których chcesz użyć . Następnie użyj, aby wykonać końcowe inicjalizacje, które chcesz wykonać, gdy wszystko się zakończy.
onCreate()ViewonCreateView()onActivityCreated()


Jeśli chcesz zobaczyć oficjalną dokumentację Androida, znajdziesz ją tutaj:
- - -onCreate()
onCreateView()
onActivityCreated()

Istnieją również nieco inne, ale mniej rozwinięte pytania / odpowiedzi na temat przepełnienia stosu:

Farbod Salamat-Zadeh
źródło
6
Pomyślałem, że zaimplementuję nie graficzną inicjalizację w onCreate (), aby nie były wywoływane ponownie, gdy ekran zostanie obrócony. Okazuje się, że muszę wywołać fragment.setRetainInstance (true), w przeciwnym razie zarówno onCreate (), jak i onCreateView () są wywoływane ponownie po obróceniu ekranu.
Cholerne warzywa
Czy w onCreateView () jest bezpieczny dostęp do hierarchii widoków?
Cody
@Cody Uważam, że tak - dostęp do hierarchii widoków jest właśnie tym celem onCreateView.
Farbod Salamat-Zadeh
1
Jednak aktywność onCreate () może się nie skończyć, dopóki onActivityCreated ()? Czy są jakieś szanse na awarię programu onCreateView w celu uzyskania dostępu do hierarchii widoku? Nie jestem pewien, jaka jest różnica między onCreateView () / onActivityCreated ()
Cody
1
Należy zwrócić uwagę (przynajmniej w przypadku AppCompatActivity) na to, że po odtworzeniu działania (np. Po zminimalizowaniu i zabiciu) fragmenty onCreate () zostaną wywołane przed zakończeniem działań onCreate () i super.onCreate (). Może to stanowić problem, jeśli używasz czegoś takiego jak Sztylet i potrzebujesz dostępu do czegoś w wstrzykiwanym działaniu nadrzędnym. Jednym z rozwiązań tego jest umieszczenie kodu w onActivityCreated (), który jest wywoływany zawsze wywoływany jest onCreate ().
Nicholas,
144

Dla każdego, kto szuka zwięzłej, obrazowej odpowiedzi:

enter image description here https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


I,

enter image description here

miazga
źródło
21
Zgoda. Komiks Sans jest niezbędny do takich rzeczy
Kartik Chugh
1
Po raz pierwszy widzę 3 różne czcionki na tym samym schemacie i jakoś moje życie wydaje się teraz kompletne.
Gil Sand
Kiedy dokładnie fragment może się zrestartować?
Saurabh
1
Dlaczego fragment nie jest ponownie tworzony, gdy proces jest martwy? AFAIK, tylko stan zadania zachowany jako pakiet, a po ponownym utworzeniu aplikacja jest ponownie przenoszona na pierwszy plan.
stdout
6

onActivityCreated () - Przestarzałe

onActivityCreated()jest teraz przestarzałe jako Fragmenty Wersja 1.3.0-alpha02

Metoda onActivityCreated () jest teraz przestarzała. Kod dotykający widoku fragmentu powinien zostać wykonany w onViewCreated () (który jest wywoływany bezpośrednio przed onActivityCreated ()), a inny kod inicjujący powinien być w onCreate (). Aby otrzymać wywołanie zwrotne w szczególności po zakończeniu działania onCreate () działania, LifeCycleObserver należy zarejestrować w cyklu życia działania w funkcji onAttach () i usunąć po otrzymaniu wywołania zwrotnego onCreate ().

Szczegółowe informacje można znaleźć tutaj

Gastón Saillén
źródło