Zaktualizowałem aplikację, aby korzystała z najnowszej biblioteki obsługi (wersja 23.0.0), dowiedziałem się, że przestała ona działać funkcja onAttach () klasy Fragment.
Zamiast:
onAttach (Activity activity)
Śnieży:
onAttach (Context context)
Ponieważ moja aplikacja korzysta z aktywności przekazanej przed wycofaniem, możliwym rozwiązaniem jest:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Czy to byłby właściwy sposób na zrobienie tego?
AKTUALIZACJA:
Jeśli uruchomię urządzenie z interfejsem API niższym niż 23, nowa funkcja onAttach () nawet nie zostanie wywołana. Mam nadzieję, że nie to zamierzali zrobić!
AKTUALIZACJA 2:
Problem został rozwiązany dzięki najnowszym aktualizacjom zestawu SDK.
Testowałem na moim urządzeniu API 22 i wywoływany jest onAttach (kontekst).
Kliknij tutaj, aby śledzić zgłoszenie błędu, które otworzyłem kilka tygodni temu i odpowiedzi od facetów z Google.
źródło
Context
? Czy i tak nie potrzebujeszActivity
, aby dołączyć i wyświetlić fragment? Jak inaczej użyjesz tegoContext
parametru?onAttach(Context context)
wywołać nowego , musisz albo użyć urządzenia, które ma co najmniej API 23 LUB użyć android.support.v4.app.Fragment. Zobacz tutajOdpowiedzi:
Aktywność jest kontekstem, więc jeśli możesz po prostu sprawdzić, czy kontekst jest Aktywnością i przesłać go w razie potrzeby.
Aktualizacja: Niektórzy twierdzą, że nowe
Context
zastąpienie nigdy nie jest wywoływane. Zrobiłem kilka testów i nie mogę znaleźć scenariusza, w którym jest to prawda i zgodnie z kodem źródłowym nigdy nie powinno być to prawdą. We wszystkich testowanych przypadkach, zarówno przed, jak i po SDK23, zarówno wersja, jakActivity
iContext
wersjaonAttach
były wywoływane. Jeśli możesz znaleźć scenariusz, w którym tak nie jest, sugeruję utworzenie przykładowego projektu ilustrującego problem i zgłoszenie go zespołowi ds . Androida .Aktualizacja 2: Zawsze używam fragmentów Biblioteki pomocy technicznej Androida, ponieważ błędy są tam naprawiane szybciej. Wydaje się, że powyższy problem polegający na tym, że przesłonięcia nie są poprawnie wywoływane, wychodzi na jaw tylko wtedy, gdy używasz fragmentów frameworka.
źródło
onAttach(Context)
nawet nie wydają się być nazywane.onAttach(context)
go wywołać.Jest to kolejna wielka zmiana od Google ... sugerowanych modyfikacji zamienić
onAttach(Activity activity)
zonAttach(Context context)
rozbił swoje aplikacje na starszych API ponieważonAttach(Context context)
nie zostanie wywołana na rodzime fragmentów.Korzystam z natywnych fragmentów (android.app.Fragment), więc musiałem wykonać następujące czynności, aby znów działały na starszych interfejsach API (<23).
Oto co zrobiłem:
źródło
Jeśli użyjesz fragmentów frameworka, a wersja SDK urządzenia jest mniejsza niż 23,
OnAttach(Context context)
nie zostanie wywołana.Zamiast tego używam fragmentów wsparcia, więc przestanie być naprawione i
onAttach(Context context)
zawsze wywoływane.źródło
Obecnie z
onAttach
kodu fragmentu nie jest jasne, czyContext
jest to bieżąca aktywność: kod źródłowyJeśli rzucisz okiem
getActivity
, zobaczysz to samo połączenieWięc jeśli chcesz mieć pewność, że otrzymujesz Aktywność, użyj
getActivity()
(wonAttach
w swojeFragment
), ale nie zapomnij sprawdzić,null
bo jeślimHost
jestnull
Twoja aktywność będzienull
źródło
źródło
Chociaż wydaje się, że w większości przypadków wystarczy mieć
onAttach(Context)
, istnieją pewne telefony (np .: Xiaomi Redme Note 2), w których nie jest wywoływany, dlatego powoduje wyjątki NullPointerExceptions. Aby być bezpiecznym, sugeruję pozostawienie przestarzałej metody:źródło
Pobierz najnowszą bibliotekę pomocy technicznej za pomocą menedżera SDK i dołącz
w gradle.app i ustaw wersję kompilacji na api 23
źródło
Poniższa odpowiedź jest związana z ostrzeżeniem o wycofaniu występującym w samouczku Fragmenty w witrynie dla programistów Androida i może nie być związana z powyższymi postami.
Użyłem tego kodu na lekcji samouczka i zadziałało.
Martwiłem się, że ta aktywność może być zerowa, jak podaje dokumentacja.
getActivity
FragmentActivity getActivity () Zwraca FragmentActivity, z którą ten fragment jest obecnie powiązany. Może zwrócić wartość null, jeśli fragment jest skojarzony z kontekstem.
Ale onCreate na main_activity wyraźnie pokazuje, że fragment został załadowany, więc po tej metodzie wywołanie działania get z fragmentu zwróci klasę main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Mam nadzieję, że się z tym zgadzam. Jestem absolutnym nowicjuszem.
źródło
prawdopodobnie używasz
android.support.v4.app.Fragment
. W tym przypadku zamiastonAttach
metody wystarczy użyć,getActivity()
aby uzyskaćFragmentActivity
z którym fragment jest powiązany. W przeciwnym razie możesz użyćonAttach(Context context)
metody.źródło
Działa to dla mnie, gdy zdefiniowałem interfejs użytkownika „TopSectionListener”, jego obiekt activitycommander:
źródło