6

Mam szufladę nawigacji z wieloma fragmentami, a jednym z nich jest tablayout z dwoma fragmentami recyclerview, elementy RecyclerView znikają po przełączeniu się między fragmentami szuflady nawigacji, znalazłem rozwiązanie, które trzeba użyć metody setOffscreenPageLimit() z ViewPager ale daje mi błąd, który jest wymieniony w tytule zapytaniaFragmentManager już wykonuje transakcje po użyciu metody setOffscreenPageLimit()

tutaj jest mój logcat

java.lang.IllegalStateException: FragmentManager is already executing transactions 
                       at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1626) 
                       at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679) 
                       at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
                       at android.support.v4.view.ViewPager.populate(ViewPager.java:1240) 
                       at android.support.v4.view.ViewPager.populate(ViewPager.java:1088) 
                       at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:852) 
                       at com.amir.ahmed.EELUStudentUnion.SelectionFragment.setupViewPager(SelectionFragment.java:59) 
                       at com.amir.ahmed.EELUStudentUnion.SelectionFragment.onActivityCreated(SelectionFragment.java:40) 
                       at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) 
                       at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) 
                       at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:158) 
                       at android.app.ActivityThread.main(ActivityThread.java:7225) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

czyli układ zakładka fragment kodu

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    viewPager.setOffscreenPageLimit(2); 

    tabLayout = (TabLayout) getActivity().findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    setupTabIcons(); 
} 



private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager()); 
    adapter.addFrag(new Courses(), "IT"); 
    adapter.addFrag(new CoursesBussiness(), "Business"); 
    viewPager.setAdapter(adapter); 
} 

Odpowiedz

18

Napotkałem podobny problem, jak ty, po kilku godzinach badań, znalazłem problem. Jeśli twoja ViewPager jest utworzona wewnątrz Fragmentu, musisz użyć getChildFragmentManager() dla FragmentPagerAdapter, zamiast getFragmentManager().

Twoja metoda setupViewPager() powinna wyglądać następująco.

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    adapter.addFrag(new Courses(), "IT"); 
    adapter.addFrag(new CoursesBussiness(), "Business"); 
    viewPager.setAdapter(adapter); 
} 

Podstawową przyczyną problemu jest osadzenie Fragmentów wewnątrz Fragmentu, dlatego zostanie zgłoszony wyjątek.

java.lang.IllegalStateException: FragmentManager is already executing transactions 

Według docs w Google:

Teraz można osadzić wewnątrz fragmenty fragmentów. Jest to przydatne w różnych sytuacjach, w których chcesz umieścić dynamiczne i wielokrotnego użytku komponenty interfejsu użytkownika w komponencie interfejsu użytkownika, który sam jest dynamiczny i można go ponownie użyć. Na przykład, jeśli korzystasz z ViewPagera do tworzenia fragmentów, które przesuwają się w lewo i w prawo i zajmują większość miejsca na ekranie, możesz teraz wstawiać fragmenty do każdej strony fragmentu. Aby zagnieździć fragment, po prostu wywołaj getChildFragmentManager() w Fragmentie, w którym chcesz dodać fragment. Spowoduje to zwrócenie fragmentu FragmentManager, z którego można korzystać, jak zwykle, z poziomu aktywności najwyższego poziomu, aby utworzyć transakcje fragmentów .

+0

Bro !!!!!! Czy wiesz, że jesteś geniuszem !!!! –

+1

Mam ten problem od września 2016 r., A Twoja odpowiedź pomogła mi go rozwiązać. Dzięki za tonę !!!! –

+0

To powinna być akceptowana odpowiedź – Rahul

Powiązane problemy