2013-11-22 40 views
1

我把一個FragmentTabHost放入ViewPager中,但是在旋轉設備後標籤內容消失了。如果我點擊另一個標籤刷新內容,標籤內容將會回來。我的代碼有什麼問題嗎?請幫助我知道。在ViewPager中旋轉後標籤內容消失

public class MyActivity extends FragmentActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LayoutInflater inflater = getLayoutInflater(); 

     View tabView = inflater.inflate(R.layout.tab, null); 
     FragmentTabHost tabHost = (FragmentTabHost) tabView.findViewById(android.R.id.tabhost); 
     tabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 
     tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab1"), TabContent1Fragment.class, null); 
     tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Tab2"), TabContent2Fragment.class, null); 

     View page2 = inflater.inflate(R.layout.page2, null); 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); 
     List<View> list = new ArrayList<View>(); 
     list.add(page2); 
     list.add(tabView); 

     viewPager.setAdapter(new DemoPagerAdapter(list)); 
    } 
} 


public class TabContent1Fragment extends Fragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.tab_content_1, null); 
    } 
} 

public class DemoPagerAdapter extends PagerAdapter 
{ 
    private List<View> mModeViewPageList; 

    public DemoPagerAdapter(List<View> modeViewPageList) 
    { 
     this.mModeViewPageList = modeViewPageList; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) 
    { 
     container.addView(mModeViewPageList.get(position), 0); 
     return mModeViewPageList.get(position); 
    } 

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

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

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

回答

5

感謝我的朋友,最後我發現原因是我用了PagerAdapter

旋轉設備時,將重新創建所有視圖。但沒有額外的片段管理代碼,PagerAdapter不能管理視圖內片段的狀態(在我的情況下是realtabcontent中的選項卡內容片段),並且視圖的子片段在旋轉後將消失。

所以我應該改變ViewPager的所有視圖爲片段,並使用FragmentPagerAdapter來代替。

還有一件事,應該使用onCreateView中的片段getChildFragmentManager()而不是來自FragmentActivity的getSupportFragmentManger()來管理片段中的子片段。

+1

謝謝。 getChildFragmentManager()爲我做了訣竅。這樣的救世主 – naamadheya

+0

在'childFragmentManager'上替換'activity.supportFragmentManager'幫助我。謝謝。 – comm1x

1

我想指出Light的答案中的一個重點。如果您將Activity轉換爲Fragment,那麼您可能一直在使用getSupportFragmentManager。轉換時,您可能已將其更改爲getActivity().getSupportFragmentManager()。它會看起來有效,直到你離開並返回片段,並且你會發現一些片段丟失,直到你滾動尋呼機。

解決方法是將getActivity().getSupportFragmentManager()更改爲getChildFragmentManager()