使用ViewPager序列化片段

时间:2014-07-21 14:30:20

标签: android android-fragments android-viewpager

我有三个片段:A,B和C.

在B片段中,我有一个包含3个片段的viewpager。 我用片段替换我的内容框架:

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, A).commit();

然后我用B片段替换内容帧并设置第二个viewpager片段。 所以我用C片段替换了内容框架。

最后,我用B片段替换内容框架,并且viewpager出现在第一个片段上。

如何序列化并保存B片段实例状态和相对内部viewpager状态?

编辑:

这是我的FragmentViewPager

公共类FragmentViewPager扩展了Fragment {

PagerAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true); //Will ignore onDestroy Method (Nested Fragments no need this if parent have it)

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_view_pager, container, false);

    adapter = new PagerAdapter(getChildFragmentManager());
    final PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) rootView.findViewById(R.id.tabs);
    final ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
    pager.post(new Runnable() {
        public void run() {
            pager.setAdapter(adapter);
            tabs.setViewPager(pager);
        }
    });

    return rootView;

}


@Override
public void onResume() {
    super.onResume();
    adapter.notifyDataSetChanged();
}

public class PagerAdapter extends FragmentPagerAdapter {

    private final String[] TITLES = { "TAB1", "TAB2", "TAB3"};

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

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0: return Frag1.newInstance(position);
            case 1: return Frag2.newInstance(position);
            case 2: return Frag3.newInstance(position);
        }
        return Frag1.newInstance(position);
    }

}

1 个答案:

答案 0 :(得分:0)

解决方案比您预期的要简单得多:

我认为你Adapter的{​​{1}}看起来像这样:

ViewPager

在这种情况下问题是public class ViewPagerAdapter extends FragmentStatePagerAdapter { ... } 。通常需要的行为 - FragmentStatePagerAdapterFragment之外被回收以节省内存 - 在您的情况下是不好的。要解决这个问题并让View不被回收,只需从Fragments延伸:

FragmentPagerAdapter

但要小心!现在,public class ViewPagerAdapter extends FragmentPagerAdapter { ... } 中的所有Fragments将始终保存在内存中,无论它们是否可见!如果您的Adapter中有多个Fragments我强烈反对您使用ViewPager

我希望我能帮到你,如果你有任何其他问题,请随时提出来!