android-viewpager在每个选项卡中有多个子片段

时间:2014-10-22 23:02:22

标签: android android-fragments android-viewpager

这让我很头疼。假设我的应用有ViewPager,其中包含4个标签。我想在每个选项卡中有多个子片段。这意味着每个选项卡只有一个视图。我完全不知道如何实现这个目标....

我有FragmentActivity首先加载并设置ViewPager

public class FragActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frag_main);

        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        PagerAdapter adapter = new FFNPagerAdapter(getSupportFragmentManager());

        pager.setAdapter(adapter);
        pager.setOffscreenPageLimit(3);
        tabs.setViewPager(pager);
    }
}

然后我有FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter implements TextAndIconTabProvider {
    private final String[] TITLES = { "FIRST", "SECOND", "THIRD", "FORTH" };

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment frag = new Fragment();
        switch (position) {
        case 1:
            frag = new FirstFrag();
            break;
        case 2:
            frag = new SecondFrag();
            break;
        case 3:
            frag = new ThirdFrag();
            break;
        case 4:
            frag = new ForthFrag();
            break;

        }

        return frag;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return TITLES.length;
    }
}

上面的内容会给我一个有效的ViewPager个活动标签。然后我需要做所有4个单独的碎片。我在下面给出一个例子。

public class FirstFrag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.firstfrag, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        Button btn1 = (Button) getActivity().findViewById(R.id.btn1);
        btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // what should I put in this block??????   
                Fragment fragment = new FirstFragSub1();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.pager, fragment); //<<------what should i replace???????
                transaction.commitAllowingStateLoss();
            }
        });
    }
}

OnCreateView中的FirstFragSub1被调用,但我看不到屏幕上显示的内容。基本上只是一片空白。我知道通过替换R.id.pager不应该是正确的方法,我只是举出一个我最初的想法的例子。

这是我的FirstFragSub1

public class FirstFragSub1 extends ListFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Log.i("FirstFragSub1","onCreateView is called");
        return inflater.inflate(R.layout.subone, container, false);
    }
}

有人可以帮帮我吗?我真的没有想法......谢谢

2 个答案:

答案 0 :(得分:0)

这里有一个很棒的教程和github,详细介绍了这一点。

http://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/ https://github.com/tausiq/ViewPagerMultipleFragmentDemo

这包括处理backstack和多个选项卡,每个选项卡有多个视图。希望这个帮助我在阅读你的问题时正在寻找类似的解决方案。

答案 1 :(得分:0)

在Fragment正在膨胀的视图中有FrameLayouts。在onCreateView上,用你想要的子片段替换FrameLayout。

另外,请注意不要使用Activity的FragmentManager。 getFragmentManager返回Activity的FragmentManager,这将导致不良结果(ViewPager中只有一个片段会加载子片段)。请改用getChildFragmentManager功能。