0

Ich habe MainActivity und hat ein FragmentLayout innerhalb. Ich zeige verschiedene Fragmente in diesem Layout, wenn Tabs (wie Instagram) mit diesem Code ausgewählt werden.fragments childfragmentmanager getFragments() gibt null zurück nach ersetzen

MABaseFragment fragment = mBackStackOfFragment.get(getStackNo(stack)).peek(); 
ft.replace(R.id.contentFrame, fragment). 
currentVisibleFragment = fragment; 

In einem dieser Fragmente i haben Viewpager mit childfragmentmanager von Elternfragment erstellt. Ich schaffe Elternfragment mit diesem Code

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

    List asd = getChildFragmentManager().getFragments(); 
    if(view == null) 
    { 
     view = inflater.inflate(R.layout.fragment_search, container, false); 
     setHasOptionsMenu(false); 

     actionBar = MAMainActivity.mainActivity.getSupportActionBar(); 
     mViewPager = (ViewPager) view.findViewById(R.id.pager); 
     mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.pager_title_strip); 

     mViewPager.setOffscreenPageLimit(numberOfTabs); 
     mSlidingTabLayout.setDistributeEvenly(true); 
     pagerAdapter = new MASearchFPA(getContext(), getChildFragmentManager()); 
     mViewPager.setAdapter(pagerAdapter); 

     mSlidingTabLayout.setViewPager(mViewPager); 

     mSlidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       return getResources().getColor(R.color.colorPrimary); 
      } 

      @Override 
      public int getDividerColor(int position) { 
       return getResources().getColor(R.color.colorPrimary); 
      } 
     }); 
    } 
    return view; 
} 

Und ich referances jedes Fragment bin zu halten, weil Benutzer zu ermöglichen, fortzusetzen, wo sie von links. Es funktioniert gut mit anderen Fragmenten, die aber nicht verschachtelt Fragmente, wenn sie mit diesem verschachtelten Fragmente App aktuelles Fragment ersetzen stürzt

01-11 12:36:08.239 20857-20857/tr.com.meeapps.livyapp E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: tr.com.meeapps.livyapp, PID: 20857 
                     java.lang.IllegalStateException: Fragment no longer exists for key f0: index 0 
                      at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:692) 
                      at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 
                      at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1453) 
                      at android.view.View.dispatchRestoreInstanceState(View.java:15637) 
                      at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3268) 
                      at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3274) 
                      at android.view.View.restoreHierarchyState(View.java:15615) 
                      at android.support.v4.app.Fragment.restoreViewState(Fragment.java:477) 
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1135) 
                      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:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Weil ich denke, dass Mactive Liste des childfragmentmanager null nach Methode wird einmal ersetzen genannt und ist null zurück zu Viewpager .

Also ich weiß nicht, warum Kindfragments mActive Fragmente nach dem Ersetzen null sind. Gibt es eine Möglichkeit, dieses Verhalten zu verhindern? Danke.

bearbeiten

Und meine Adapterklasse

public class MASearchFPA extends FragmentStatePagerAdapter { 
    Context context; 
    MACategoriesFragment categoriesFragment; 
    MAMapFragment mapFragment; 
    MAFavoritesFragment favoritesFragment; 
    FragmentManager fm; 
    public MASearchFPA(Context context, FragmentManager fm) { 
     super(fm); 
     this.context = context; 

     this.fm = fm; 
     categoriesFragment = new MACategoriesFragment(); 
     mapFragment = new MAMapFragment(); 
     favoritesFragment = new MAFavoritesFragment(); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     if(position == 0) // if the position is 0 we are returning the First tab 
     { 
      return categoriesFragment; 
     } 
     else if(position == 1)    // As we are having 2 tabs if the position is now 0 it must be 1 so we are returning second tab 
     { 
      return mapFragment; 
     } 
     else 
     { 
      return favoritesFragment; 
     } 
    } 

    @Override 
    public int getCount() { 
     return MASearchFragment.numberOfTabs; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return context.getResources().getString(R.string.categories); 
      case 1: 
       return context.getResources().getString(R.string.map); 
      case 2: 
       return context.getResources().getString(R.string.favorites); 
      default: 
       return null; 
     } 
    } 

Antwort

0

I Heft mit Show solwed und Methoden verbergen. Weil die Methode replace die Referenzen von Kindfragmenten eines Fragments zerstört. Mit dem Zeigen und Verbergen von Fragmenten wurde mein Problem relativ gelöst.