2017-10-14 62 views
5

Niektóre informacje: Mam fragment, który zawiera widok strony z trzema fragmentami. Pierwszy raz, kiedy otwieram ten fragment, przeglądarka działa. drugi raz próbuję otworzyć ten fragment to wywala z następujących stacktraceWystępują awarie w moim Viewpager po otwarciu fragmentu nadrzędnego po raz drugi

UWAGA: To się dzieje na KitKat powyżej 19 API jego pracy grzywny

ViewPager kod instalacyjny wewnątrz fragmentu macierzystego

private void setupViewPager(ViewPager viewPager) { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    } else { 
     adapter = new ViewPagerAdapter(getFragmentManager()); 
    } 
    adapter.addFrag(fragment1 , "Abc"); 
    adapter.addFrag(fragment2, "Bcd"); 
    adapter.addFrag(fragment3, "Cdf"); 

    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(2); 

    myTabs.setupWithViewPager(viewPager); 
} 

Moja Adapter viewpager

class ViewPagerAdapter extends android.support.v13.app.FragmentPagerAdapter { 
    private final List<android.app.Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public android.app.Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 


    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(android.app.Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

Oto StackTrace zderzeniowych:

10-14 21:23:47.276 17601-17601/com.d.p E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.d.p, PID: 17601              
java.lang.IllegalStateException: No activity 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1044) 
    at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1853) 
    at android.app.Fragment.performActivityCreated(Fragment.java:1714) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
    at android.app.BackStackRecord.run(BackStackRecord.java:684) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

Można sprawdzić [how-to-create-dynamic-tabs-and-add-różnej funkcjonalności produktów na każdego fragmentu] (https://stackoverflow.com/questions/ 45457599/how-to-create-dynamic-tabs-and-add-different-function-to-each-fragment-in-a/45458706 # 45458706) – KeLiuyue

+0

które nie jest pomocne – Ritzor

+0

Czy możesz spróbować? – KeLiuyue

Odpowiedz

4

ostatecznie rozwiązany
Jest to błąd w natywnych fragmentów, a także wspierać v4.

Po wybraniu innego Fragmentu za pomocą szuflady nawigacji lub podobnej rzeczy fragment z podfolderami jest odrywany. Tak więc fragmentmanager fragmentManager (getChildFragmentManager()) już nie istnieje. gdy te fragmenty powracają, to się zawiesza.

W zasadzie będziemy musieli wyczyścić mChildFragmentManager w onDetach(). Po prostu umieść poniższy kod w fragmencie zawierającym zagnieżdżone fragmenty.

@Override 
public void onDetach() { 
    try { 
     Field childFragmentManager = android.app.Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    super.onDetach(); 
    } 

Source Google issue Tracker