2017-10-14 2 views
5

Quelques informations: J'ai un fragment qui contient un viewpager avec trois fragments. La première fois que j'ouvre ce viewpager de fragment fonctionne. deuxième fois que je tente d'ouvrir ce fragment puis il se bloque avec la suite stacktraceJe tombe en panne dans mon Viewpager lorsque j'ouvre le fragment parent pour la deuxième fois

NOTE: Ce qui se passe sur KitKat au-dessus de 19 API son fonctionne bien

code de configuration ViewPager intérieur fragment parent

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); 
} 

Mon adaptateur 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); 
    } 
} 

Voici le stacktrace crash:

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

Vous pouvez vérifier [comment-créer-chaque-à-dynamiques onglets et ajoutez-différentes fonctionnalité fragment] (https://stackoverflow.com/questions/ 45457599/comment créer-dynamique-onglets-et-ajouter-différent-fonctionnalité-à-chaque-fragment-dans-un/45458706 # 45458706) – KeLiuyue

+0

Ce n'est pas utile – Ritzor

+0

Pourriez-vous l'essayer? – KeLiuyue

Répondre

4

Enfin résolu
C'est le bogue dans des fragments natifs et prennent également en charge v4.

Lorsque vous choisissez un autre fragment via un tiroir de navigation ou un autre élément similaire, le fragment qui contient des sous-fragments est détaché. Ainsi, fragmentManager (getChildFragmentManager()) des sous-fragments n'existe plus. tandis que ces fragments reviennent, il se bloque.

Donc, fondamentalement, nous devrons nettoyer mChildFragmentManager dans onDetach(). Il suffit donc de placer le code ci-dessous dans le fragment contenant des fragments imbriqués.

@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