我将FragmentTabHost放入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;
}
}
答案 0 :(得分:6)
感谢我的朋友,最后我发现原因是我使用了PagerAdapter
。
旋转设备时,将重新创建所有视图。但是如果没有用于片段管理的额外代码,PagerAdapter
将无法管理视图内部片段的状态(在我的情况下,实际内容中的选项卡内容片段),并且视图的子片段将在旋转后消失。
因此,我应将ViewPager
的所有观看次数更改为片段,然后使用FragmentPagerAdapter
。
还有一件事,应该使用onCreateView中Fragment的getChildFragmentManager()
而不是FragmentActivity中的getSupportFragmentManger()
来管理片段中的子片段。
答案 1 :(得分:1)
我想在Light的回答中指出一个重要的观点。如果您将Activity
转换为Fragment
,那么您可能一直在使用getSupportFragmentManager
。转换后,您可能已将其更改为getActivity().getSupportFragmentManager()
。在您离开并返回到片段之前,它似乎会起作用,并且在您滚动寻呼机之前,您会发现一些片段丢失。
解决方案是将getActivity().getSupportFragmentManager()
更改为getChildFragmentManager()
。