Jak mogę uzyskać kontekst we fragmencie?
Muszę używać mojej bazy danych, której konstruktor przyjmuje w kontekście, ale getApplicationContext()
i FragmentClass.this
nie działają więc co mogę zrobić?
Konstruktor bazy danych
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
zmiennej instancji podczas tworzenia fragmentu, a następnie używanie tego kontekstu, kiedy tylko chcesz wewnątrz klasy fragmentu. Ten kontekst przetrwa oderwanie fragmentów.getActivity
zawsze był dostępny. ZostałgetContext
on dodany w API 23.Aby wykonać powyższą odpowiedź, możesz zastąpić
onAttach
metodę fragmentu:źródło
DatabaseHelper
potrzebyFragmentActivity
zamiast zamiastActivity
? Na przykład dlaAdapter
...onAttach(Activity activity)
, powinieneś je opublikowaćonDetach()
onAttach
Metoda została zaniechana,Overrides deprecated method in 'android.support.v4.app.Fragment'
Zawsze używaj metody getActivity () , aby uzyskać kontekst dołączonej aktywności, ale zawsze pamiętaj o jednej rzeczy: fragmenty są nieco niestabilne i
getActivity
czasami zwracają wartość null, dlatego zawsze sprawdzaj metodę isAdded () fragmentu przed uzyskaniem kontekstugetActivity()
.źródło
Najłatwiejszym i najdokładniejszym sposobem uzyskania kontekstu fragmentu, który znalazłem, jest pobranie go bezpośrednio z metody
ViewGroup
wywołaniaonCreateView
, przynajmniej tutaj, na pewno nie otrzymasz wartości null dlagetActivity()
:źródło
Wcześniej Używam
onAttach (Activity activity)
dostaćcontext
wFragment
onAttach (Activity activity)
Metoda została zaniechana poziomu API 23.Teraz, aby uzyskać kontekst
Fragment
, możemy użyćonAttach (Context context)
context
.onCreate(Bundle)
zostanie wezwany po tym.PRZYKŁADOWY KOD
UWAGA
Możemy również użyć
getActivity()
, aby uzyskaćcontext
wFragments
alegetActivity()
może wrócićnull
, jeśli Twójfragment
nie jest obecnie przypisane do rodzicaactivity
,źródło
źródło
Można również uzyskać kontekst z
inflater
parametru podczas nadpisywaniaonCreateView
.źródło
Innym alternatywnym podejściem jest:
Możesz uzyskać kontekst, używając:
źródło
uzyskanie kontekstu wewnątrz Fragmentu będzie możliwe przy użyciu
getActivity()
:Activity
skojarzenie z fragmentemgetActivity()
, możesz go użyć, ale nie jest to zalecane, ponieważ spowoduje wyciek pamięci.Myślę, że lepiej aproach musi być uzyskiwanie
Activity
zonAttach()
metodą:źródło
Activity.findViewById
Jest to tylko wygodna metoda wyszukiwania widoku w widoku zarejestrowanej treści tego działania (ustawionymsetContentView
). W twoim poprawnym przykładzie wywołujeszView.findViewById
, a nie wywołujeszActivity.findViewById
metodę w poprawnym widoku głównym. Zupełnie inny problem i oczywiście nie będziesz w stanie znaleźć swojego widoku w hierarchii widoków, która nie zawiera tego widoku.getContext()
wszedł w API 23. Zamień go na getActivity () wszędzie w kodzie.Sprawdź, czy to naprawia błąd. Spróbuj użyć metod między docelowym a minimalnym poziomem API, w przeciwnym razie ten błąd się pojawi.
źródło
Od poziomu API 23 istnieje,
getContext()
ale jeśli chcesz obsługiwać starsze wersje, możesz ich używać,getActivity().getApplicationContext()
a ja nadal zalecam korzystanie z wersji wsparcia,Fragment
którą jestandroid.support.v4.app.Fragment
.źródło
getActivity()
jest dzieckiem Kontekstu, więc powinno działać dla Ciebieźródło
Użyj fragmentów z Biblioteki pomocy technicznej -
a następnie zastąpić
W ten sposób możesz mieć pewność, że kontekst zawsze będzie wartością inną niż null.
źródło
Masz różne opcje:
getActivity()
, ponieważ jest toContext
.getContext()
.Jeśli nie potrzebujesz obsługiwać starych wersji, skorzystaj z
getContext()
.źródło
W przypadku Kotlin możesz używać
context
bezpośrednio we fragmentach. Ale w niektórych przypadkach znajdziesz błąd taki jakdo tego możesz to zrobić
źródło
W kotlin wystarczy użyć
activity
zamiastgetActivity()
źródło
Z API 29+ na Kotlinie musiałem to zrobić
Przykładem może być
źródło
W idealnym przypadku nie trzeba używać globałów. Fragment ma różne powiadomienia, z których jedno jest naActivityCreated. Możesz pobrać instancję działania w tym zdarzeniu cyklu życia fragmentu.
Następnie: możesz wyrejestrować fragment, aby uzyskać aktywność, kontekst lub kontekst aplikacji, jak chcesz:
this.getActivity()
da ci uchwyt do działaniathis.getContext()
da ci uchwyt do kontekstuthis.getActivity().getApplicationContext()
da ci uchwyt do kontekstu aplikacji. Zalecane jest używanie kontekstu aplikacji podczas przekazywania go do bazy danych.źródło
Prostym sposobem jest użycie
getActivity()
. Ale myślę, że głównym nieporozumieniem związanym z użyciemgetActivity()
metody do uzyskania kontekstu jest wyjątek wskaźnika zerowego.W tym celu najpierw sprawdź za pomocą
isAdded()
metody, która określi, czy jest dodana, czy nie, a następnie możemy użyćgetActivity()
do uzyskania kontekstu działania.źródło
Możesz zadzwonić
getActivity()
lubźródło
Możesz użyć metody getActivity (), aby uzyskać kontekst, lub możesz użyć metody getContext ().
Mam nadzieję, że to pomoże!
źródło
Metoda getContext () pomaga używać kontekstu klasy w działaniu fragmentu.
źródło
Myślę, że możesz użyć
źródło
źródło
Możesz także użyć:
ale wolałbym użyć
lub
źródło
Potrzebuję kontekstu do używania fragmentu arrayAdapter IN, kiedy korzystałem z getActivity, pojawia się błąd, ale kiedy zamieniam go na getContext , działa dla mnie
źródło
Możesz użyć
getActivity()
lubgetContext
we fragmencie.Dokumentacja
i
Pro wskazówka
Zawsze sprawdzaj,
if(getActivity!=null)
ponieważ może mieć wartość NULL, gdy fragment nie jest dołączony do działania. Czasami wykonanie długiej operacji w fragmencie (np. Pobieranie danych z pozostałych API) zajmuje trochę czasu. a jeśli użytkownik przejdzie do innego fragmentu. Wtedy getActivity będzie zerowy. I dostaniesz NPE, jeśli nie poradzisz sobie z tym.źródło
FragmentHostCallback
klasy.Na tobie fragment
Aktywność
źródło
Fragment wewnątrz próbki kotlina pomógłby komuś
jeśli korzystasz z wiązania danych;
W przypadku inicjalizacji powiązania w onCreateView w ten sposób
źródło
Metoda replaceContext () jest najprostszą opcją
Przykład
źródło