2013-03-07 16 views
15

Konwertuję wszystkie moje działania na fragmenty, dzięki czemu mogę ich używać w ViewPager.Android: Gdzie umieścić fragment działania onCreate() w fragmencie?

Szukałem tego, ale nie mogłem znaleźć satysfakcjonującej odpowiedzi, dlatego właśnie o to pytam.

W moich działaniach napisałem kod w metodzie onCreate(). Na przykład zadzwonię pod numer findViewById() s, aby połączyć kilka przycisków xml z moją Aktywnością. Też robię pewne widoki niewidoczne w onCreate(), ustawię OnClickListener(), wypełniam TextView tekstem i usuwam Powiadomienie, wszystko w metodzie onCreate().

Moje pytanie brzmi: gdzie powinienem umieścić ten kod w fragmencie? W onCreate()? onCreateView()? onActivityCreated()? i dlaczego?

Wielkie dzięki z góry!

Odpowiedz

19

Chociaż odpowiedź Pragnaniego jest bliska, nie ma w niej zbytniej wartości edukacyjnej. Poza tym jest odpowiednia opcja do jego drugiego stwierdzenia.

Gdzie powinienem umieścić ten kod w fragmencie? W onCreate()? onCreateView()? onActivityCreated()? i dlaczego?

Krótka odpowiedź brzmi: albo zrobi się onCreateView(), albo onActivityCreated(). Hierarchia widoków nie zostanie utworzona przed onCreateView(), więc jest to najwcześniejszy punkt w cyklu życia fragmentu, w którym można nadmuchać widoki i dołączyć detektory kliknięć itp. Since onActivityCreated() will always be run after onCreateView(), to także odpowiednia lokalizacja. onCreate() może zostać pominięty na rzecz systemu, który tymczasowo odłącza fragment i ponownie go podłącza, np. gdy retaining fragments.

Pragnani ma rację, wskazując, że nadmuchanie widoku fragmentu nieznacznie różni się od nadmuchania widoków w działaniu. Dokładniej: fragment nie definiuje metody findViewById(), więc musisz wywołać ją na innym obiekcie.

Zamiast używać getActivity().findViewById(), trzeba będzie getView().findViewById(). Powodem tego jest to, że jeśli użyjesz działania do wyszukiwania widoku, będziesz miał kłopoty, gdy dołączysz do niego wiele fragmentów o tym samym ID widoku. Będzie tak w przypadku ponownego użycia identyfikatorów widoku w układach różnych fragmentów lub pokazania dwóch identycznych fragmentów, które wyświetlają różne dane. W obu przypadkach tylko pierwszy mecz zostanie zwrócony, a ty naprawdę chcesz, aby widok był podszyty pod konektem fragmentu. To właśnie zwraca getView(), główny widok fragmentu (który powrócił w onCreateView()), a tym samym odpowiednio ogranicza zakres wyszukiwania.

+0

Dziękuję bardzo za wyczerpującą odpowiedź! To jest dokładnie to, czego potrzebowałem! – Xander

+0

Nie mogę wywołać 'getView()' w 'onCreateView()', to daje mi NullPointerException – Xander

+0

To prawda: 'getView()' nie zostanie ustawione dopóki 'onCreateView()' zwróci - być może powinienem był to zrobić bardziej wyraźne. Jednakże, ponieważ nadpisujesz widok główny w 'onCreateView()', nie powinieneś wywoływać 'getView()', ale zamiast tego wywołaj 'findViewById()' w widoku, który ostatecznie wrócisz. Na przykład: zobacz ['CountingFragment'] (http://developer.android.com/reference/android/app/Fragment.html#BackStack). –

3

1. Lewy onCreate puste i po prostu zadzwoń super.onCreate()

2. Zamiast findViewById() użyć getActivity(). FindViewById() zawsze używać getActivity() gdzie trzeba kontekst widoku.

Do all other operations in onCreateview() 
+0

Całkowicie przeciwny temu, co ten dokument https://github.com/thecodepath/android_guides/wiki/Creating-and-Using-Fragments mówi – tsil

Powiązane problemy