Próbuję utworzyć ImageView we fragmencie, który będzie odnosił się do elementu ImageView, który utworzyłem w XML dla tego fragmentu. Jednak findViewById
metoda działa tylko wtedy, gdy rozszerzę klasę Activity. Czy w ogóle mogę go użyć w Fragmentie?
public class TestClass extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ImageView imageView = (ImageView)findViewById(R.id.my_image);
return inflater.inflate(R.layout.testclassfragment, container, false);
}
}
W findViewById
metodzie występuje błąd wskazujący, że metoda jest niezdefiniowana.
android
android-fragments
android-imageview
findviewbyid
uproszczony.
źródło
źródło
Odpowiedzi:
Użyj metody getView () lub parametru View zaimplementowanej
onViewCreated
metody. Zwraca widok główny fragmentu (ten zwróconyonCreateView()
metodą) . Dzięki temu możesz zadzwonićfindViewById()
.Jak
getView()
działa dopiero późniejonCreateView()
, nie można użyć go wewnątrzonCreate()
anionCreateView()
metod fragmentu.źródło
ImageView
pochodzi z zawyżonego układu - szczegóły znajdziesz w mojej odpowiedzi. W przeciwnym razie onCreateView jest właściwym miejscem do zrobienia tego @ N-AccessDevonActivityCreated()
jest to zalecane miejsce do wyszukiwania i przechowywania odniesień do twoich widoków. Państwo musi posprzątać te przechowywane referencje ustawiając je z powrotemnull
wonDestroyView()
lub będzie wyciekActivity
.Trzeba nadmuchać widok i połączenie fragmentu jest
findViewById()
naView
to zwraca.źródło
NullPointerException
.Wewnątrz
Fragment
klasy otrzymasz metodę przesłonięcia onViewCreated () , w której zawsze należy inicjalizować swoje widoki, ponieważ w tej metodzie otrzymujesz obiekt widoku, za pomocą którego możesz znaleźć swoje widoki, takie jak:Zawsze pamiętaj w przypadku Fragmentu, że
onViewCreated()
metoda nie będzie wywoływana automatycznie, jeśli zwracasz wartość null lubsuper.onCreateView()
zonCreateView()
metody. Będzie się nazywać domyślnie w przypadkuListFragment
gdyListFragment
zwrotFrameLayout
domyślnie.Uwaga: widok fragmentu można uzyskać w dowolnym miejscu w klasie, używając
getView()
razonCreateView()
wykonanego pomyślnie. to znaczyźródło
view
przekazane doonViewCreated
nadal powoduje,NullPointerException
ale używaniegetActivity()
jest w porządku. Jakieś pomysły dlaczego?onCreateView
metody. Właśnie debugowałem i okazuje się, że jest to układ (w moim przypadkuFrameLayout
). Biorąc to pod uwagę, gdy próbuję znaleźć element, zwracanull
. Dlaczego tak się dzieje?Zdaję sobie sprawę, że to stare pytanie, ale dominująca odpowiedź pozostawia wiele do życzenia.
Pytanie nie jest jasne, czego się wymaga
imageView
- czy przekazujemy je z powrotem jako widok, czy po prostu zachowujemy odniesienie na później?Tak czy inaczej, jeśli
ImageView
pochodzi z napompowanego układu, poprawnym sposobem byłoby:źródło
Uzyskaj najpierw widok fragmentu, a następnie uzyskaj z tego widoku swoją ImageView.
źródło
Możesz to również zrobić w
onActivityCreated
metodzie.Tak jak tutaj: http://developer.android.com/reference/android/app/Fragment.html (przestarzałe na poziomie API 28)
i
są możliwe.
źródło
getView()
da widok rootźródło
Możesz zastąpić funkcję onViewCreated (), która jest wywoływana zaraz po zawyżeniu wszystkich widoków. To właściwe miejsce do wypełnienia
View
zmiennych członka Fragmentu . Oto przykład:źródło
Wewnątrz
Fragment
klasy otrzymujemyonViewCreated()
metodę przesłonięcia, w której zawsze powinniśmy inicjalizować nasze widoki, ponieważ w tej metodzie otrzymujemyview
obiekt. Za pomocą tego obiektu możemy znaleźć nasze widoki jak poniżej:źródło
Metoda getView () nie będzie działać na fragmentach poza OnCreate i podobnymi metodami.
Masz dwa sposoby, przekaż widok do funkcji w trakcie tworzenia (co oznacza, że możesz uruchamiać swoje funkcje tylko podczas tworzenia widoku) lub ustawić widok jako zmienną:
źródło
1) najpierw napompuj układ Fragmentu, a następnie użyj findviewbyId.
źródło
źródło
Posługiwać się
to będzie działać
źródło
zgodził się
findViewById()
na wywołanie Widoku.źródło
Uwaga :
Z poziomu API 26 nie musisz też specjalnie rzutować wyniku findViewById, ponieważ używa on wnioskowania dla swojego typu zwracanego.
Więc teraz możesz po prostu zrobić,
źródło
Zgodnie z dokumentacją na poziomie API 11
Odwołanie w Back Stack http://developer.android.com/reference/android/app/Fragment.html
krótki kod
źródło
Za pomocą
getView()
zwraca widok fragmentu, a następnie można wywołaćfindViewById()
dostęp do dowolnego elementu widoku w widoku fragmentu.źródło
Wypróbuj to, działa dla mnie
źródło
Najlepszym sposobem na wdrożenie tego jest:
W ten sposób rootView może być użyty dla każdej kontrolki zdefiniowanej w układzie xml, a kod jest znacznie bardziej przejrzysty w ten sposób.
Mam nadzieję że to pomoże :)
źródło
1) Zadeklaruj plik układu.
2) Następnie uzyskaj identyfikator swojego widoku
źródło
Użyj wtyczki gradle szkielet , automatycznie wygeneruje klasy uchwytów widoków w odniesieniu do twojego układu.
Zakładając, że masz już
ImageView
zadeklarowanymy_layout.xml
plik, automatycznie wygeneruje dla ciebie klasę myLayout.źródło
Spróbuj tego:
źródło
próbować
źródło
getView()
późniejMożesz wywoływać
findViewById()
za pomocą obiektu aktywności, który znajdziesz w swojejpublic void onAttach(Activity activity)
metodzie wewnątrz fragmentu.Zapisz działanie w zmiennej, na przykład:
W klasie Fragment :
private Activity mainActivity;
wonAttach()
metodzie:this.mainActivity=activity;
Na koniec wykonaj każde findViewById poprzez vairable:
mainActivity.findViewById(R.id.TextView);
źródło
Jest jeszcze jedna metoda o nazwie onViewCreated.
źródło
Wewnątrz metody onCreateView
1) najpierw musisz nadmuchać układ / widok, który chcesz dodać np. Układ liniowy
2) Następnie możesz znaleźć identyfikator imageView z układu
3) zwróć napompowany układ
źródło
Musisz nadmuchać widok
źródło
W fragmentach potrzebujemy widoku tego okna, aby utworzyć onCreateView tego fragmentu.
Następnie uzyskaj widok i użyj go, aby uzyskać dostęp do każdego identyfikatora widoku tego elementu widoku.
źródło
Układ inflatora pojawia się tutaj. Layout inflater to klasa, która pozwala nam korzystać z widoków XML w kodzie Java. Możesz więc napompować główny widok xml w zmiennej v następującym kodem. A następnie za pomocą v można znaleźć widoki potomne widoku głównego v.
źródło
Najłatwiejszym sposobem korzystania z takich rzeczy jest użycie maślanki. Dzięki temu możesz dodać tyle Onclciklistenerów tylko przez @OnClick (), jak opisano poniżej:
źródło