2

J'ai une activité qui utilise un FragmentTabHost, donc chaque onglet contient un fragment à l'intérieur. Dans le premier onglet, j'ai 2 fragments imbriqués, un sur la moitié supérieure de l'écran, l'autre sur la moitié inférieure. Le fragment sur le fond utilise un ViewPager pour parcourir plusieurs LinearLayouts. Tout fonctionne plutôt bien.FragmentTabHost, Fragments imbriqués et ViewPager

Jusqu'à ce que vous passiez à un autre onglet et reveniez au premier. Le fragment imbriqué du bas n'apparaît plus, mais celui sur le dessus le fait.

est ici un code montrant mon utilisation:

Voici comment j'utilise mon activité principale:

public class MainActivity extends SherlockFragmentActivity 
{ 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main_activity_layout_vert); 

     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("TAB1").setIndicator("", getResources().getDrawable(R.drawable.tab1_selector)), Tab1Fragment.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("TAB2").setIndicator("", getResources().getDrawable(R.drawable.tab2_selector)), Tab2Fragment.class, null); 
    } 
} 

Voilà comment j'utilise le fragment pour tab1:

public class Tab1Fragment extends SherlockFragment 
{ 
    private NestedFragment1 mNestedFrag1 = null; 
    private NestedFragment2 mNestedFrag2 = null; 


    @Override 
    public void onCreate(Bundle inSavedInstanceState) 
    { 
     super.onCreate(inSavedInstanceState); 

     mNestedFrag1 = new NestedFragment1(); 
     mNestedFrag2 = new NestedFragment2(); 

     FragmentManager fragManager = getChildFragmentManager(); 
     FragmentTransaction fragTransaction = fragManager.beginTransaction(); 

     fragTransaction.add(R.id.nested_frag1_container, mNestedFrag1, "Frag1"); 
     fragTransaction.add(R.id.nested_frag2_container, mNestedFrag2, "Frag2"); 
     fragTransaction.commit(); 
    } 

    @Override 
    public void onDestroy() 
    { 
     FragmentManager fragManager = getChildFragmentManager(); 
     FragmentTransaction fragTransaction = fragManager.beginTransaction(); 

     fragTransaction.remove(mNestedFrag1); 
     fragTransaction.remove(mNestedFrag2); 
     fragTransaction.commit(); 
    } 
} 

Et voici comment j'utilise le 2ème fragment imbriqué (celui qui disparaît):

public class NestedFragment2 extends SherlockFragment 
{ 
    private MyPageAdapter mPageAdapter; 
    private ViewPager mViewPager; 

    @Override 
    public void onCreate(Bundle inSavedInstanceState) 
    { 
     super.onCreate(inSavedInstanceState); 

     mPageAdapter = new MyPageAdapter(); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View toReturn = inflater.inflate(R.layout.nested_fragment1_layout_top, container, false); 

     mViewPager = (ViewPager)toReturn.findViewById(R.id.viewpager); 
     mViewPager.setAdapter(mPageAdapter); 
     mViewPager.setOffscreenPageLimit(5); 

     return toReturn; 
    } 

    private class MyPageAdapter extends PagerAdapter 
    { 
     @Override 
     public Object instantiateItem(ViewGroup container, int position) 
     {   
      View page = getActivity().getLayoutInflater().inflate(R.layout.view_pager_controls_layout, container, false); 

      container.addView(page); 

      return page; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) 
     { 
      container.removeView((View)object); 
     } 

     @Override 
     public int getCount() 
     { 
      return 5; 
     } 

     @Override 
     public float getPageWidth(int position) 
     { 
      return 1; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) 
     { 
      return(view == object); 
     } 
    } 
} 

Pensées?

Répondre

0

Semble être détruit lorsque vous passez à un onglet différent. Essayez de mettre ViewPager.setOffscreenPageLimit() à un nombre élevé et voir si cela arrive encore.

+0

Je le mets déjà à 5. Est-il possible que vous ayez mal compris? Le viewpager n'a rien à voir avec les onglets. Il est utilisé dans un fragment imbriqué dans le premier onglet. – KairisCharm

+0

Je voudrais voir comment vous implémentez les 2 fragments imbriqués. – Dororo

+0

S'il vous plaît voir mon edit à mon poste. – KairisCharm

0

Le plus probable est que vous devriez utiliser un childFragmentManager pour les fragments imbriqués, au lieu de celui obtenu à partir de l'activité.

D'un "haut niveau" fragment chaque fois que vous allez faire la transaction pour inclure l'utilisation de fragments imbriqué getChildFragmentManager() au lieu de getFragmentManager()

+0

Oups - vient de publier mon code, et comme vous pouvez le voir, j'utilise ChildFragmentManager. – KairisCharm

0

I figured it out. Le code ci-dessus n'était pas le problème. Le problème avait à voir avec la façon dont je traitais l'inflation PagerAdapter. Je ne le faisais pas exactement comme je l'ai montré ci-dessus. La façon dont je l'utilisais en réalité empêchait une inflation des opinions.

Questions connexes