【问题标题】:FragmentTabHost, Nested Fragments and ViewPagerFragmentTabHost、嵌套片段和 ViewPager
【发布时间】:2013-06-19 21:06:13
【问题描述】:

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

想法?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我已经将它设置为 5。您可能误解了吗? viewpager 与选项卡无关。它用于第一个选项卡内的嵌套片段中。
    • 我需要看看你是如何实现这两个嵌套片段的。
    【解决方案2】:

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

    每当您要执行事务以包含嵌套片段时,从“顶级”片段使用getChildFragmentManager() 而不是getFragmentManager()

    【讨论】:

    • 糟糕 - 刚刚发布了我的代码,如您所见,我正在使用 ChildFragmentManager。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多