2013-11-22 1 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은보기 내부 조각의 상태를 관리 할 수 ​​없으며 (내 사례에서는 탭 콘텐츠 조각이 실시간 콘텐츠 콘텐트에 있음) 순환 게재 후에보기의 하위 조각이 사라집니다.

그래서 모든 뷰를 ViewPager에 대해 조각으로 바꾸고 FragmentPagerAdapter을 사용해야합니다.

한 번 더, 조각에서 하위 조각을 관리하기 위해 FragmentActivity에서 getSupportFragmentManger() 대신 onCreateView의 조각에서 getChildFragmentManager()을 사용해야합니다.

+1

감사합니다. getChildFragmentManager()가 나를 위해 속임수를 사용했습니다. 그러한 생명의 구원자 – naamadheya

+0

'childFragmentManager'의'activity.supportFragmentManager'를 대체하는 데 도움이됩니다. 고맙습니다. – comm1x

1

Light의 대답에서 중요한 점을 지적하고 싶었습니다. ActivityFragment으로 변환하면 getSupportFragmentManager을 사용했을 수 있습니다. 변환 할 때 getActivity().getSupportFragmentManager()으로 변경했을 수 있습니다. 당신이 떠나서 조각으로 돌아갈 때까지는 겉으로보기에는 작동 할 것입니다. 그리고 호출기를 스크롤 할 때까지 조각을 놓친다는 것을 알게 될 것입니다.

해결책은 getActivity().getSupportFragmentManager()getChildFragmentManager()으로 변경하는 것입니다.