2

我有一个使用 a 的活动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);
        }
    }
}

想法?

4

3 回答 3

0

当您移动到不同的选项卡时,听起来好像它正在被破坏。尝试设置ViewPager.setOffscreenPageLimit()一个高数字,看看它是否仍然发生。

于 2013-06-19T21:14:28.757 回答
0

我想到了。上面的代码不是问题。这个问题与我处理 PagerAdapter 膨胀的方式有关。我没有完全按照我上面展示的那样做。我实际使用它的方式是防止视图膨胀。

于 2013-06-20T16:47:03.907 回答
0

很可能是因为您应该对嵌套片段使用 childFragmentManager,而不是从活动中获得的片段。

每当您要进行交易时,从“顶级”片段中包含嵌套片段使用getChildFragmentManager()而不是getFragmentManager()

于 2013-06-19T21:41:26.233 回答