Nie znaleziono fragmentu Androida dla identyfikatora?


287

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_activityto 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?


3
Czy możesz dołączyć XML?
jsmith

1
Ten sam błąd można uzyskać podczas dokonywania transakcji fragmentu przed wywołaniem setContentView w działaniu
Pavel

Odpowiedzi:


374

Miałem ten problem też, aż zdałem sobie sprawę, że miałem zły układ określony w setContentView()o onCreate()sposobie FragmentActivity.

Identyfikator przekazany FragmentTransaction.add()w Twoim przypadku R.id.feedContentContainermusi być dzieckiem układu określonego w setContentView().

Nie pokazałeś nam swojego onCreate() metody, więc może to ten sam problem.


5
Co rozumiesz przez podrzędny układ określony w setContentView? Jak sprawić, by było dziecko?
NinjaCoder,

11
Widok jest potomkiem innego widoku, jeśli jest zadeklarowany w widoku nadrzędnym w pliku XML. to znaczy. TextViewwewnątrz terenu RelativeLayoutjest dzieckiem RelativeLayout.
howettl

@howettl: Wiem, że to trochę stary post. Ale nie jestem w stanie rozwiązać tego problemu z twoją odpowiedzią. Oto SO pytanie: stackoverflow.com/questions/25844394/... - Czy możesz mi w tym pomóc? Dzięki!
TheDevMan

@howettl, czy możesz mi pomóc z podobnym problemem. stackoverflow.com/questions/26966623/…
Vamsi Challa

3
Zdarzyło mi się. Minusem CTRL + C CTRL + V.
0nyx

296

Ten błąd występuje również po zagnieżdżeniu fragmentów i dodaniu ich za pomocą getSupportFragmentManager () zamiast getChildFragmentManager ().


10
Mój był na odwrót. Próbowałem dodać do głównego kontenera fragmentów, wywołując metodę getChildFragmentManager (). Wskazanie tego rozwiązało dla mnie to. Dzięki +1
speedynomads

@Malachiasz: Czy możesz rzucić okiem na to pytanie dotyczące ViewPager? Dziękuję stackoverflow.com/questions/27937250/…
Hoa Vu

To był dokładnie mój problem, dziękuję. Dziwne, ale zdarzyło się to tylko w orientacji poziomej podczas wywoływania .show (). Wykorzystanie go do zastąpienia głównego fragmentu działało dobrze.
cohenadair

1
To był dokładnie mój problem, dziękuję bardzo! Działo się to tylko na niektórych powolnych urządzeniach, więc trudno było zrozumieć, co się dokładnie dzieje.
YawaraNes,

1
Po wielokrotnym podejściu do tego pytania czułem się, jakby nikt inny nie miał mojego problemu, musiałem tylko trochę przewinąć w dół. Byłoby miło, gdyby mogli uzyskać bardziej szczegółowy kod błędu, aby powiedzieć, że tak może być.
KodyVanRy

67

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.


4
@ surfer190 getSupportFragmentManager()zamiast tego użyj .
Amir Hossein Ghasemi

Zmieniono na getChildFragmentManager () i to działa !!
Shyam,

W moim przypadku korzystałem z nawigacji fragmentów za pomocą przeglądarki w fragmencie dolnego arkusza. Twoje rozwiązanie działało doskonale !! Ton Thanx bracie.
Debasish Ghosh

1
miałem ten sam problem i to dla mnie rozwiązało! getChildFragmentManager () zamiast getActivity (). getFragmentManager () co ma sens, kiedy o tym pomyślałem :) TY!
Simon

Wywołuję metodę z działania, ale getFragmentManager()teraz jest przestarzała!
Alireza Noorali

29

Miałem ten problem (podczas budowania interfejsu użytkownika w kodzie) i był spowodowany ViewPagertym, ż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źć.


1
Miałem ten sam problem, gdy korzystałem z viewPager. Ten sam błąd został naprawiony za pomocą viewPager.setCurrentItem (n) przed wykonaniem transakcji. Może przyda się komuś.
Kirk Hammett

W moim przypadku było w podobnym kierunku, ale problem polegał na tym, że użyłem ujemnej wartości w .setID. Użycie dodatniej liczby całkowitej rozwiązało problem.
Ignacio Hagopian,

29

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ć

FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

kluczem jest getActivity (). ...


tak ... dla mnie wszystkie inne wdrożenia były w porządku oprócz tego. Próbowałem bezpośrednio uzyskać dostęp do kodu w następujący sposób: FragmentTransaction transaction = getSupportFragmentManager (). BeginTransaction (); Potem dostałem menedżera fragmentów za pomocą getActivity () oddzielnie, jak wspomniałeś. Działa całkiem nieźle
anand krish

18

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.

    public class PagerDialog extends DialogFragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.pager_dialog, container, false);

        MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
        ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
        pager.setAdapter(pagerAdapter);

        return rootView;
    }
}

Funkcja getChildFragmentManager () nie jest dostępna z DialogFragment
Abdalrahman Shatou

14

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ć.


Kompilator nie zgłasza, czy brak identyfikatora w bieżącym układzie, jeśli nie jest on unikalny, dlatego prawdziwym problemem nie jest unikalność identyfikatora, ale pominięcie identyfikatora w bieżącym układzie.
Samuel

13

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->ida następnie wyszukaj identyfikator0x7f080011 .

Kiedy miałem ten problem, ten identyfikator należał do FrameLayoutmojegoactivity_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.


1
Miły. W Android Studio w / LinuxOS jest tutaj: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / wygenerowany / source / r / release / android / support / v7 / appcompat.
porty

11

Wystąpił ten błąd podczas aktualizacji z com.android.support:support-v4:21.0.0do com.android.support:support-v4:22.1.1.

Musiałem zmienić układ z tego:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout> 

Do tego:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container_frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</FrameLayout> 

Dlatego układ MUSI mieć widok potomny. Zakładam, że wymusili to w nowej bibliotece.


9

Z zagnieżdżonymi fragmentami

Dla mnie przy użyciu getChildFragmentManager()zamiast getActivity().getSupportFragmentManager()rozwiązania awarii

java.lang.IllegalArgumentException: Nie znaleziono widoku dla identyfikatora


ale wewnątrz adaptera nie mogę imprt getchildFragmentManger dlaczego
Sunil Chaudhary

8

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!


3
Hmm ... w moim przypadku nie miało znaczenia, czy taki kod był w OnCreate czy onResume
IgorGanapolsky

@IgorGanapolsky również w moim przypadku rozwiązał to za pomocą wywołania zwrotnego z fragmentu onAttach. Zobacz moją odpowiedź
Aleksander Malachow

To był dokładnie mój problem. Wezwanie do innej klasy w celu odświeżenia stanu widoku przeprowadzało transakcję fragmentu na układzie, który nie został jeszcze zawyżony. Wywołanie go w onResume () naprawiło problem.
AWT

8

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:

java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}

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:

public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;

// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
    //super(fm);
    this.mContext = mContext;
    this.productDetails = productDetails;
}

// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);

    imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
    String url = null;
    if (imagelists != null) {
        url = imagelists.get(position).getImage();
    }

    // This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
    ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);

    // Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
    container.addView(layout);
    return layout;
}

// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    /*super.destroyItem(container, position, object);*/
}

// Get the count
@Override
public int getCount() {
    int size = 0;

    if (productDetails != null) {
        imagelists =  productDetails.getImagelist();
        if (imagelists != null) {
            size = imagelists.size();
        }
    }
    Log.d(TAG,"Adapter Size = "+size);
    return size;
}

// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {

    return view == object;
}

}

Mam nadzieję, że to było pomocne !!


Tak, to rozwiązanie działało, ale co, jeśli potrzebuję trudnej konstrukcji z własnym cyklem życia i zmiennymi, ale nie tylko widokami? Będzie używany z widokami wideo i widokami obrazu z przyciskami odtwarzania i wyciszania. Nic pomocnego w mojej sprawie?
Nikita Axyonov,


7

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.


wyłącz false twój setRetainInstance (true), jeśli jesteś w zagnieżdżonych fragmentach, naprawi to błąd.
ralphgabb

5

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)


4

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.


3

Miałem ten sam problem, pozwólcie, że opublikuję mój kod, abyście mogli go zobaczyć i nie robić tego samego, co ja.

@Override
protected void onResume()
{
    super.onResume();

    fragManager = getSupportFragmentManager();

    Fragment answerPad=getDefaultAnswerPad();
    setAnswerPad(answerPad);
    setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
    fragManager.beginTransaction()
        .add(R.id.AnswerArea, pad, "AnswerArea")
        .commit();
    fragManager.executePendingTransactions();
}

Pamiętaj, że tworzyłem fragmenty wcześniej setContentView. Ups


1
Dziękuję Ci! Robiłem to samo, więc setContentViewwrzuciłem swojeonBuildHeaders
Randy,

3

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ć includeznacznika 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:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include layout="@layout/former_fragment_layout" />

</FrameLayout>

gdzie former_fragment_layoutjest 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 .


to dobra sugestia, ale nie działa, jeśli trzeba dynamicznie przełączać fragmenty. Zmniejsza to również możliwość ponownego użycia, ponieważ można zawrzeć zachowanie (kod) we fragmencie.
Alexander Malakhov,

Zdecydowanie się zgadzam. Fragmenty są znacznie lepsze.
Suragch,

2

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!


2

Dzieje się tak, gdy dzwonisz z fragmentu w innym.

posługiwać się :

getActivity().getSupportFragmentManager().beginTransaction();

1

Napotkałem ten problem, gdy próbowałem zamienić widok na mój fragment w onCreateView(). Lubię to:

public class MyProjectListFrag extends Fragment {


    private MyProjectListFragment myProjectListFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();
    }

To mi powiedziało

11-25 14:06:04.848: E/AndroidRuntime(26040): java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}

Potem naprawiłem ten problem z umieszczaniem zamiennika w onActivityCreated(). Lubię to:

public class MyProjectListFrag extends Fragment {

    private final static String TAG = "lch";

    private MyProjectListFragment myProjectListFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return inflater
                .inflate(R.layout.frag_my_project_list, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();

    }
  1. Musisz zwrócić widok onCreateView(), aby móc go później zastąpić
  2. Możesz umieścić dowolną operację w tym widoku w następującej funkcji w fragmencie cyklu podnoszenia, np onActivityCreated()

Mam nadzieję że to pomoże!


1

Naprawiłem ten błąd, używam commitNow()zamiennika commit().

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

Jest commitNowto metoda synchronizacji, commit()metoda jest metodą asynchroniczną.


1

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.


0

Jeśli próbujesz zastąpić fragment w obrębie fragmentu, fragmentManagerale nie nadmuchujesz fragmentu nadrzędnego, który może powodować problem.

W BaseFragment.java OnCreateView :

if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new DifferentFragment())
                    .commit();
        }

return super.onCreateView(inflater, container, savedInstanceState);

Zamień na super.onCreateView(inflater, container, savedInstanceState); nadmuchanie poprawnego układu fragmentu:

        return inflater.inflate(R.layout.base_fragment, container, false);

0

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:

public class MyContainerFragment extends Fragment {
    public static interface Callbacks {
        void onMyContainerAttached();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "--- onAttach");
        ((Callbacks) activity).onMyContainerAttached();
    }

    //... rest of code
}

A potem w aktywności:

public class MainActivity extends Activity
        implements MyContainerFragment.Callbacks
{
    @Override
    public void onMyContainerAttached() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.containerFrame, new MyFragment())
                .commit();
    }

    //...
}

0

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ął.


0

Ten problem występuje również wtedy, gdy nie umieścić <include layout="@layout/your_fragment_layout"/>w swojejapp_bar_main.xml


0

Dzieje się tak również wtedy, gdy masz dwa widoki w dwóch fragmentach o tych samych identyfikatorach


To jest niepoprawne. W takim przypadku kod nawet się nie skompiluje.
Taslim Oseni

0

Miałem ten sam problem, który został spowodowany, ponieważ próbowałem dodać fragmenty przed dodaniem układu kontenera do działania.


0

Czasami dzieje się tak, ponieważ używasz BottomNavigationView. Jeśli otworzysz zamiar w nawigacji i w tej aktywności otworzysz fragment, powiedzmy

transaction.replace(R.id.container,new YourFragment());

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.


0

W moim przypadku. Mam trochę czasu Activityz serwerem, Fragmentktóry muszę odtworzyć, Fragmentkiedy

  • język to zmiana
  • układ fragmentów niektóre nie potrzebują, lub zmiana treści wymaga odtworzenia
  • inne zmiany
  • Wyczyszczam wszystkie Fragmenti ustawiam wszystko nanullWyczyszczam 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 null

    na przykład

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
    Licensed under cc by-sa 3.0 with attribution required.