ViewPager里面的片段,如何保留状态?

Upv*_*ote 12 android android-fragments fragmentpageradapter

在我的应用程序中,片段活动包含两个片段,片段A和片段B.片段B是包含3个片段的视图寻呼机.

在此输入图像描述

在我的活动中,为了防止在配置更改时重新创建片段:

if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
    getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainTabFragment(), MAIN_TAB_FRAGMENT).commit();
}
Run Code Online (Sandbox Code Playgroud)

片段B的代码:

public class MainTabFragment extends Fragment {

    private PagerSlidingTabStrip mSlidingTabLayout;
    private LfPagerAdapter adapter;
    private ViewPager mViewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        this.adapter = new LfPagerAdapter(getChildFragmentManager());

        this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        this.mViewPager.setAdapter(adapter);

        this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
        this.mSlidingTabLayout.setViewPager(this.mViewPager);
    }
}
Run Code Online (Sandbox Code Playgroud)

适配器代码:

public class LfPagerAdapter extends FragmentPagerAdapter {

    private static final int NUM_ITEMS = 3;

    private FragmentManager fragmentManager;

    public LfPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragmentManager = fm;
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        Log.d("TEST","TEST");
        switch (position) {
            case 1:
                return FragmentC.newInstance();
            case 2:
                return FragmentD.newInstance();
            default:
                return FragmentE.newInstance();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法保持视图分页器的状态,它的子片段在方向更改上.

显然每次轮换都要调用它:

this.adapter = new LfPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

这将导致整个寻呼机被重建,对吧?结果是

getItem(int position)
Run Code Online (Sandbox Code Playgroud)

将在每次轮换时调用,片段将从头开始创建并失去其状态:

return FragmentC.newInstance();
Run Code Online (Sandbox Code Playgroud)

我尝试解决这个问题:

if(this.adapter == null)
    this.adapter = new LfPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

onViewCreated,但结果是,在旋转寻呼机内的片段,其中除去.

任何想法如何正确保留寻呼机内的状态?

Meh*_*sar 27

您需要做两件事来解决问题:

1)你应该使用onCreate方法而不是onViewCreated实例化LfPagerAdapter;

即:

    public class MainTabFragment extends Fragment {

    private PagerSlidingTabStrip mSlidingTabLayout;
    private LfPagerAdapter adapter;
    private ViewPager mViewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        this.adapter = new LfPagerAdapter(getChildFragmentManager());
    }

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {


        this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        this.mViewPager.setAdapter(adapter);

        this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
        this.mSlidingTabLayout.setViewPager(this.mViewPager);
    }
}
Run Code Online (Sandbox Code Playgroud)

2)你需要延伸FragmentStatePagerAdapter而不是FragmentPagerAdapter