ViewPager里面的片段,如何留住状态? [英] ViewPager inside fragment, how to retain state?

查看:90
本文介绍了ViewPager里面的片段,如何留住状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In my application the fragment activity holds two fragments, Fragment A and Fragment B. Fragment B is a view pager that contains 3 fragments.

在我的活动,该片段是在重新配置的变化prevent:

In my activity, to prevent that the fragment is recreated on config changes:

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

code的片段B:

Code for Fragment 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);
    }
}

code适配器:

Code for the adapter:

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();
        }
    }
}

我的问题是,我不能够保留看法寻呼机的状态的其子片段的方向改变。

My problem is that I am not able to retain the state of the view pager an its child fragments on orientation changes.

显然,这就是所谓的每次旋转:

Obviously this is called on every rotation:

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

这将导致整个寻呼机重新创建,对不对?结果

which will cause the whole pager to be recreated, right? As a result

getItem(int position)

将被要求每一个旋转和片段将从头创建,失去他的状态:

will be called on every rotation and the fragment will be created from scratch and losing his state:

return FragmentC.newInstance();

我试图解决这个搭配:

I tried solving this with:

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

onViewCreated 但结果是,在旋转寻呼机里面的片段,其中删除。

in onViewCreated but the result was that on rotation the fragments inside the pager where removed.

任何想法如何正确地保留了寻呼机中的状况?

Any ideas how to correctly retain the state inside the pager?

推荐答案

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

You will need to do 2 things to resolve the issue:

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

1) You should use onCreate method instead of onViewCreated to instantiate 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);
    }
}

2),您将需要扩展 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter

这篇关于ViewPager里面的片段,如何留住状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆