2

我有一個活動,其利用一個FragmentTabHost的,因此,每個標籤都有它裏面的片段。在第一個標籤中,我有兩個嵌套片段,一個在屏幕的上半部分,另一個在下半部分。底部的片段使用ViewPager掃描幾個LinearLayouts。這一切都很好。FragmentTabHost,嵌套片段和ViewPager

直到您移到另一個選項卡並返回第一個。底部的嵌套片段不再出現,但頂部的嵌套片段不會。

下面是一些代碼展示了我的用法:

這是我如何用我的主要活動:

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

這裏是我如何使用片段爲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(); 
    } 
} 

這裏是我如何使用第二嵌套片段(即消失的一個):

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

想法?

回答

0

聽起來好像當你移動到不同的標籤時它被破壞。嘗試將ViewPager.setOffscreenPageLimit()設置爲很高的數字,看看它是否仍然發生。

+0

我已經將它設置爲5 難道你誤會? viewpager與標籤無關。它用在第一個選項卡內的嵌套片段中。 – KairisCharm

+0

我需要看看你是如何實現2嵌套片段。 – Dororo

+0

請查看我的編輯到我的文章。 – KairisCharm

0

最有可能是因爲你應該使用childFragmentManager的嵌套片段,而不是從活動中獲得的一個。

從「頂層」片段時,你會做交易,包括代替getFragmentManager()

+0

糟糕 - 只是發佈我的代碼,正如你所看到的,我使用ChildFragmentManager。 – KairisCharm

0

嵌套片段使用getChildFragmentManager()我想通了。上面的代碼不是問題。這個問題與我處理PagerAdapter通貨膨脹的方式有關。我沒有完全按照上面的方式進行。我實際使用它的方式是防止意見通貨膨脹的發生。