FragmentTabHost,嵌套片段和ViewPager

时间:2013-06-19 21:06:14

标签: android android-fragments android-viewpager fragment-tab-host android-nested-fragment

我有一个使用FragmentTabHost的活动,因此每个标签中都有一个片段。在第一个标签中,我有2个嵌套片段,一个在屏幕的上半部分,另一个在下半部分。底部的片段使用ViewPager来扫描多个LinearLayouts。这一切都很好。

直到您移动到另一个标签,然后返回第一个标签。底部嵌套片段不再出现,但顶部的片段会出现。

以下是一些展示我用法的代码:

这就是我使用我的主要活动的方式:

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

思想?

3 个答案:

答案 0 :(得分:0)

当您移动到其他选项卡时,听起来好像被销毁一样。尝试将ViewPager.setOffscreenPageLimit()设置为较高的数字并查看它是否仍然存在。

答案 1 :(得分:0)

最有可能的原因是你应该使用childFragmentManager作为嵌套片段,而不是从活动中获得的片段。

从“顶级”片段开始,只要您要执行事务以包含嵌套片段,请使用getChildFragmentManager()代替getFragmentManager()

答案 2 :(得分:0)

我明白了。上面的代码不是问题。问题与我处理PagerAdapter通胀的方式有关。我没有完全按照上面的说明去做。我实际使用它的方式是防止意见的膨胀发生。