Mam fragment, który próbuję dodać do widoku.
FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
.findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();
if (content == null || content.isRemoving()) {
content=new feed_parser_activity(item.getLink().toString());
xaction
.add(R.id.feedContentContainer, content)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
Log.e("Abstract", "DONE");
}
Po uruchomieniu tego kodu pojawia się następujący błąd podczas debugowania ..
java.lang.IllegalArgumentException: No view found for id 0x7f080011
for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}
feed_parser_activity
to Fragment, który jest ustawiony na Układ fragmentu w xml.
Używam FragmentActivity do hostowania układu fragmentu zawierającego feed_parser_layout
.
Czy koduję to poprawnie powyżej?
android
android-fragments
illegalargumentexception
coder_For_Life22
źródło
źródło
Odpowiedzi:
Miałem ten problem też, aż zdałem sobie sprawę, że miałem zły układ określony w
setContentView()
oonCreate()
sposobie FragmentActivity.Identyfikator przekazany
FragmentTransaction.add()
w Twoim przypadkuR.id.feedContentContainer
musi być dzieckiem układu określonego wsetContentView()
.Nie pokazałeś nam swojego
onCreate()
metody, więc może to ten sam problem.źródło
TextView
wewnątrz terenuRelativeLayout
jest dzieckiemRelativeLayout
.Ten błąd występuje również po zagnieżdżeniu fragmentów i dodaniu ich za pomocą getSupportFragmentManager () zamiast getChildFragmentManager ().
źródło
Rozwiązaniem było użyć
getChildFragmentManager()
zamiast
getFragmentManager()
dzwoniąc z fragmentu. Jeśli wywołujesz metodę z działania, użyj
getFragmentManager()
.To rozwiąże problem.
źródło
getSupportFragmentManager()
zamiast tego użyj .getFragmentManager()
teraz jest przestarzała!Miałem ten problem (podczas budowania interfejsu użytkownika w kodzie) i był spowodowany
ViewPager
tym, że mój (który pokazałFragment
) nie miał zestawu identyfikatorów, więc po prostu użyłem,pager.setID(id)
a potem zadziałało.Ta strona pomogła mi to rozgryźć.
źródło
Kolejny scenariusz, który spotkałem. Jeśli używasz zagnieżdżonych fragmentów, powiedz ViewPager we fragmencie z jego stronami również fragmentami.
Kiedy wykonasz transakcję Fragment w wewnętrznym fragmencie (strona ViewPager), będziesz potrzebować
kluczem jest getActivity (). ...
źródło
W moim przypadku próbowałem wyświetlić DialogFragment zawierający pager i ten wyjątek został zgłoszony, gdy FragmentPagerAdapter próbował dodać Fragmenty do pager. W oparciu o howettl odpowiedź wydaje mi się, że to z powodu rodzica Pager nie był widokiem ustawionym w setContentView () w mojej FragmentActivity.
Jedyną zmianą, jaką zrobiłem, aby rozwiązać problem, było utworzenie FragmentPagerAdapter przekazującego FragmentMager uzyskanego przez wywołanie getChildFragmentManager (), a nie tej uzyskanej przez wywołanie getFragmentManager () jak zwykle.
źródło
Ten wyjątek może również wystąpić, jeśli przekazywany identyfikator układu
FragmentTransaction.replace(int ID, fragment)
istnieje w innych układach, które są zawyżane. Upewnij się, że identyfikator układu jest unikalny i powinien działać.źródło
Odpowiedź, którą przeczytałem w innym wątku podobnym do tego, który działał dla mnie, gdy miałem ten problem, dotyczyła układu xml.
Twój logcat mówi „Nie znaleziono widoku dla identyfikatora 0x7f080011”.
Otwórz,
gen->package->R.java->id
a następnie wyszukaj identyfikator0x7f080011
.Kiedy miałem ten problem, ten identyfikator należał do
FrameLayout
mojegoactivity_main.xml
plików.FrameLayout nie miał identyfikatora (nie było instrukcji
android:id = "blablabla"
).Upewnij się, że wszystkie komponenty we wszystkich układach mają identyfikatory, w szczególności komponent cytowany w logcat.
źródło
Wystąpił ten błąd podczas aktualizacji z
com.android.support:support-v4:21.0.0
docom.android.support:support-v4:22.1.1
.Musiałem zmienić układ z tego:
Do tego:
Dlatego układ MUSI mieć widok potomny. Zakładam, że wymusili to w nowej bibliotece.
źródło
Z zagnieżdżonymi fragmentami
Dla mnie przy użyciu
getChildFragmentManager()
zamiastgetActivity().getSupportFragmentManager()
rozwiązania awariiźródło
Wiem, że odpowiedziano już na jeden scenariusz, ale mój problem był nieco inny i pomyślałem, że podzielę się, na wypadek gdyby ktoś inny był w moich butach.
Dokonałem transakcji wewnątrz
onCreate()
, ale w tym momencie drzewo widoku nie zostało zawyżone, więc pojawia się ten sam błąd. Wprowadzanie kodu transakcjionResume()
sprawiło, że wszystko działało dobrze.Upewnij się więc, że kod transakcji działa po napompowaniu drzewa widoku!
źródło
onAttach
. Zobacz moją odpowiedźNapotkałem paskudny błąd podczas korzystania z Viewpager w widoku Recycler View. Poniżej błędu spotkałem się w specjalnej sytuacji. Zacząłem fragment, który miał RecyclerView z Viewpager (używając FragmentStatePagerAdapter). Działało dobrze, dopóki nie zmieniłem fragmentu po kliknięciu komórki w RecyclerView, a następnie nawigowałem wstecz za pomocą sprzętowego przycisku Wstecz telefonu i aplikacja uległa awarii.
Zabawne było to, że miałem dwa Viewpagers w tym samym RecyclerView i oba były w odległości około 5 komórek (inne nie były widoczne na ekranie, było wyłączone). Więc początkowo po prostu zastosowałem Rozwiązanie do pierwszego Viewpagera i zostawiłem inny taki, jaki jest (Viewpager przy użyciu Fragmentów).
Nawigowanie wstecz działało poprawnie, gdy można było wyświetlić pager pierwszego widoku. Teraz, gdy przewinąłem do drugiego, a potem zmieniłem fragment i wróciłem, zawiesił się (to samo stało się z pierwszym). Musiałem więc zmienić oba Viewpagers.
W każdym razie przeczytaj poniżej, aby znaleźć działające rozwiązanie. Błąd awarii poniżej:
Spędziłem godziny na debugowaniu. Przeczytaj ten pełny wpis wątku do samego dołu, stosując wszystkie rozwiązania, w tym upewniając się, że przekazuję childFragmentManager.
Nic nie działało.
Wreszcie zamiast używać FragmentStatePagerAdapter, rozszerzyłem PagerAdapter i użyłem go w Viewpager bez użycia fragmentów. Wierzę, że w niektórych miejscach jest BŁĄD z zagnieżdżonymi fragmentami. W każdym razie mamy opcje. Czytaj ...
Poniższy link był bardzo pomocny:
Przeglądarka bez fragmentów
Link może umrzeć, dlatego poniżej zamieszczam moje zaimplementowane rozwiązanie:
}
Mam nadzieję, że to było pomocne !!
źródło
Miałem ten sam problem, ale mój problem występował podczas zmiany orientacji. Żadne z pozostałych rozwiązań nie zadziałało. Okazuje się więc, że zapomniałem usunąć
setRetainInstance(true);
z moich fragmentów, wykonując układ dwóch lub jednego panelu w oparciu o rozmiar ekranu.źródło
Mój błąd polegał na
FragamentTransaction
.Robiłem to
t.replace(R.layout.mylayout);
zamiastt.replace(R.id.mylayout);
Różnica polega na tym, że jeden jest układem, a drugi jest odniesieniem do
layout(id)
źródło
Na wypadek, gdyby ktoś popełnił ten sam głupi błąd, co ja; sprawdź, czy gdzieś nie nadpisujesz treści aktywności (tj. poszukaj dodatkowych wywołań do setContentView)
W moim przypadku z powodu nieostrożnego kopiowania i wklejania użyłem DataBindingUtil.setContentView w moim fragmencie, zamiast DataBindingUtil.inflate, co pomieszało stan działania.
źródło
Miałem ten sam problem, pozwólcie, że opublikuję mój kod, abyście mogli go zobaczyć i nie robić tego samego, co ja.
Pamiętaj, że tworzyłem fragmenty wcześniej
setContentView
. Upsźródło
setContentView
wrzuciłem swojeonBuildHeaders
Ta strona wydaje się być dobrą centralną lokalizacją do publikowania sugestii dotyczących fragmentu IllegalArgumentException. Oto jeszcze jedna rzecz, którą możesz wypróbować. Oto, co w końcu dla mnie zadziałało:
Zapomniałem, że mam osobny plik układu dla orientacji poziomej. Po dodaniu tam również mojego kontenera FrameLayout fragment zadziałał.
W osobnej notatce, jeśli wypróbowałeś już wszystko inne sugerowane na tej stronie (a także cały Internet) i wyciągałeś włosy przez wiele godzin, rozważ po prostu zrzucenie tych irytujących fragmentów i powrót do starego, dobrego standardowego układu. (Właśnie tak robiłem, kiedy w końcu odkryłem swój problem.) Nadal możesz korzystać z koncepcji kontenera. Jednak zamiast wypełniać go fragmentem, możesz użyć
include
znacznika xml, aby wypełnić go tym samym układem, którego używałbyś w tym fragmencie. Możesz zrobić coś takiego w swoim głównym układzie:gdzie
former_fragment_layout
jest nazwa pliku układu xml, którego próbujesz użyć w swoim fragmencie. Aby uzyskać więcej informacji, zobacz Ponowne używanie układów z włączeniem .źródło
W moim przypadku miałem element SupportMapFragment w elemencie widoku recyklera (korzystałem z dolnego narzutu „liteMode”, który sprawia, że mapa wydaje się być nieinteraktywna, prawie jak obraz statyczny). Używałem poprawnego menedżera fragmentów i wszystko działało dobrze ... z małą listą. Gdy lista elementów nieco przekroczyła wysokość ekranu, zacząłem uzyskiwać ten problem podczas przewijania.
Okazało się, że to dlatego, że wstrzykiwałem dynamiczny SupportMapFragment do widoku, który był w innym fragmencie, aby obejść niektóre problemy, które miałem podczas próby zadeklarowania go statycznie w moim pliku XML. Z tego powodu układ zastępczy fragmentu można zastąpić rzeczywistym fragmentem dopiero po dołączeniu widoku do okna, tj. Widocznym na ekranie. Więc umieściłem swój kod do inicjalizacji SupportMapFragment, wykonania fragmentu zamień i wywołania getMapAsync () w zdarzeniu onAttachedToWindow.
Zapomniałem tylko upewnić się, że mój kod nie uruchomi się dwukrotnie. Tj. W zdarzeniu onAttachedToWindow, sprawdź, czy moje dynamiczne narzędzie SupportMapFragment wciąż ma wartość NULL, zanim spróbujesz utworzyć jego nową instancję i wykonać zamianę fragmentu. Gdy element zejdzie z góry RecyclerView, jest odłączany od okna, a następnie ponownie dołączany po przewinięciu z powrotem do niego, więc to zdarzenie jest uruchamiane wiele razy.
Gdy dodałem kontrolę zerową, zdarzyło się to tylko raz na element RecyclerView i problem zniknął! TL; DR!
źródło
Dzieje się tak, gdy dzwonisz z fragmentu w innym.
posługiwać się :
źródło
Napotkałem ten problem, gdy próbowałem zamienić widok na mój fragment w
onCreateView()
. Lubię to:To mi powiedziało
Potem naprawiłem ten problem z umieszczaniem zamiennika w
onActivityCreated()
. Lubię to:onCreateView()
, aby móc go później zastąpićonActivityCreated()
Mam nadzieję że to pomoże!
źródło
Naprawiłem ten błąd, używam
commitNow()
zamiennikacommit()
.Jest
commitNow
to metoda synchronizacji,commit()
metoda jest metodą asynchroniczną.źródło
W moim przypadku ten wyjątek został zgłoszony, gdy użyłem różnych identyfikatorów dla tego samego elementu układu (symbol zastępczy fragmentu), mając jednocześnie kilka z nich dla różnych wariantów kompilacji. Z jakiegoś powodu działa idealnie dobrze, gdy wymieniasz fragment po raz pierwszy, ale jeśli spróbujesz to zrobić ponownie, otrzymasz ten wyjątek. Upewnij się więc, że używasz tego samego identyfikatora, jeśli masz wiele układów dla różnych wariantów kompilacji.
źródło
Jeśli próbujesz zastąpić fragment w obrębie fragmentu,
fragmentManager
ale nie nadmuchujesz fragmentu nadrzędnego, który może powodować problem.W BaseFragment.java
OnCreateView
:Zamień na
super.onCreateView(inflater, container, savedInstanceState);
nadmuchanie poprawnego układu fragmentu:źródło
Miałem ten sam problem, kiedy robiłem transakcję fragmentu podczas tworzenia aktywności.
Podstawowym problemem jest to, co już wskazał Nick - drzewo widoków nie zostało jeszcze zawyżone. Ale jego rozwiązanie nie działało - ten sam wyjątek w onResume, onPostCreate itp.
Rozwiązaniem jest dodanie wywołania zwrotnego do fragmentu kontenera, aby zasygnalizować, kiedy jest on gotowy:
A potem w aktywności:
źródło
W moim przypadku użyłem pliku klasy fragmentu, aby zadeklarować klasę adaptera widoku listy. Właśnie użyłem innego pliku dla publicznej klasy adaptera i błąd zniknął.
źródło
Ten problem występuje również wtedy, gdy nie umieścić
<include layout="@layout/your_fragment_layout"/>
w swojejapp_bar_main.xml
źródło
Dzieje się tak również wtedy, gdy masz dwa widoki w dwóch fragmentach o tych samych identyfikatorach
źródło
Miałem ten sam problem, który został spowodowany, ponieważ próbowałem dodać fragmenty przed dodaniem układu kontenera do działania.
źródło
Czasami dzieje się tak, ponieważ używasz BottomNavigationView. Jeśli otworzysz zamiar w nawigacji i w tej aktywności otworzysz fragment, powiedzmy
wtedy Aktywność nie będzie w stanie znaleźć używanej metody nawigacji.
ROZWIĄZANIE: zmień aktywność na fragment i obsługuj nawigację za pomocą addOnBackStack w aplikacji. Jeśli wdrożyłeś Nawigację Jetpack, po prostu użyj fragmentów w swoim projekcie.
źródło
W moim przypadku. Mam trochę czasu
Activity
z serwerem,Fragment
który muszę odtworzyć,Fragment
kiedyWyczyszczam wszystkie
Fragment
i ustawiam wszystko nanull
Wyczyszczam aktywność, ale Fragment już sam się tworzy, podczas gdy aktywnością hosta jest bean ustawiony na null, więc przed wywołaniem widoku fragmentu sprawdź go nullna przykład
źródło