在ViewPager中旋转后,选项卡内容消失

时间:2013-11-22 15:50:11

标签: android android-viewpager android-tabhost

我将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;
    }
}

2 个答案:

答案 0 :(得分:6)

感谢我的朋友,最后我发现原因是我使用了PagerAdapter

旋转设备时,将重新创建所有视图。但是如果没有用于片段管理的额外代码,PagerAdapter将无法管理视图内部片段的状态(在我的情况下,实际内容中的选项卡内容片段),并且视图的子片段将在旋转后消失。

因此,我应将ViewPager的所有观看次数更改为片段,然后使用FragmentPagerAdapter

还有一件事,应该使用onCreateView中Fragment的getChildFragmentManager()而不是FragmentActivity中的getSupportFragmentManger()来管理片段中的子片段。

答案 1 :(得分:1)

我想在Light的回答中指出一个重要的观点。如果您将Activity转换为Fragment,那么您可能一直在使用getSupportFragmentManager。转换后,您可能已将其更改为getActivity().getSupportFragmentManager()。在您离开并返回到片段之前,它似乎会起作用,并且在您滚动寻呼机之前,您会发现一些片段丢失。

解决方案是将getActivity().getSupportFragmentManager()更改为getChildFragmentManager()