当包含Fragment重新创建时,ViewPager中的片段未加载

11

我有一个名为MyFragment的Fragment,其中包含一个ViewPager,里面包含多个Fragment。第一次加载MyFragment时它可以正常工作,但如果我返回并重新创建它,则ViewPager中的Fragment不会显示,因为方法FragmentPagerAdapter.getItem没有被调用。

我正在使用

问题出在哪里?

import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
...

public class MyFragment extends Fragment {

    private ViewPager pager;
    private MyPagerAdapter adapter;

    private List<Fragment> fragmentList = new ArrayList<Fragment>();

    public MyFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
        return inflater.inflate(R.layout.my_fragment_layout, container, false);
    }

    public void onViewCreated(View v, Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);

        indicators = (PagerSlidingIndicator) v.findViewById(R.id.indicators);
        pager = (ViewPager) v.findViewById(R.id.pager);

        Fragment fragment1 = new Fragment1();
        fragmentList.add(fragment1);

        Fragment fragment2 = new Fragment2();
        fragmentList.add(fragment2);

        Fragment fragment3 = new Fragment3();
        fragmentList.add(fragment3);

        adapter = new IndicatorPagerAdapter(getFragmentManager());
        pager.setAdapter(adapter);
    }

    public class MyPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public int getCount() {
            return fragmentList.size();
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }
    }
}
1个回答

34
如果您正在使用嵌套的片段(“我有一个名为MyFragment的Fragment,其中包含更多的Fragment的ViewPager”),则在设置FragmentPagerAdapter时需要使用getChildFragmentManager()而不是getFragmentManager()。请注意保留原文中的HTML标签。

getChildFragmentManager():调用需要API级别17,而我的min = 15。所以唯一的方法是使用support Fragment,对吗? - jul
是的,令人遗憾的事实是,我不得不将所有的Fragment替换为支持Fragment,以便能够使用getChildFragmentManager()。 - jul
@jul:是的,嵌套片段的概念只在API Level 17中添加到片段的本机实现中。您的替代方案要么是不将ViewPager放在片段中,要么是不将片段作为ViewPager的页面。 - CommonsWare
@CommonsWare 我有一个类似的问题,但我的ViewPager包含在一个带有片段作为页面的活动中。有没有办法让它像这样工作,或者我必须将viewpager包装在一个片段中(例如,它将是activity->fragment->viewpager->fragments作为viewpager中的页面)?我的问题在这里,如果您能查看一下就好了!谢谢。 - David Velasquez
我已经搜索了一周,寻找这个问题的解决方案,谢谢。 - Abhishek Garg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接