使用ViewPager切换选项卡时Fragment被重新创建

6

我有一个带有4个选项卡的ViewPager

我正在使用一个自定义适配器,它扩展了FragmentPagerAdapter

问题在于,当我切换选项卡时,第一个Fragment会再次创建,尽管它不是当前可见的。 而且,这只发生在第四次更改选项卡后。例如,选项卡1 -> 选项卡2 -> 选项卡3=>从选项卡1调用onStop。->选项卡2 =>onCreateView从选项卡1调用(onAttach未被调用)。

我想避免这种情况。即使它们当前未显示,我需要所有选项卡始终保持它们的状态。 我该怎么做?

3个回答

24

谢谢,伙计,我终于让我的代码工作了!我一直在寻找保存的实例,但这个1行代码让我的代码工作了 xD - Cyph3rCod3r
当设置为0时,仍然似乎加载了侧面碎片..最小值是1吗?编辑:事实证明是的,最小值为1。 - behelit

1

Viewpager有一个名为setOffScreenPageLimit的公共方法,它指示在空闲状态下将保留在当前页面视图层次结构两侧的页面数量。

活动:

    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

...

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = findViewById(R.id.container);
        mViewPager.setOffscreenPageLimit(3);  // change your number here
        mViewPager.setAdapter(mSectionsPagerAdapter);

0
当您实例化片段时,请调用setRetainInstance(true)。这将保留片段的实例状态。 onCreateView 仍将被调用,您需要确保重新使用保存的状态,并仅呈现视图而不再加载任何数据,例如通过使用 boolean 来表示您的片段是否已经初始化。
您可以像这样做:
public static class MyAdapter extends FragmentPagerAdapter {
       @Override
       public Fragment getItem(int position) {
               MyFragment myFragment = new MyFragment();
               myFragment.setRetainInstance(true);
               return myFragment;
       }
}

class MyFragment extends Fragment {
       .
       .
       .

       boolean initialized = false;
       ArrayList<MyData> myData = null;

       void onCreate(...) {
               if (initialized) {
                       renderViews();
               } else {
                       initialized = true;
                       loadData();
                       renderViews();
               }
       }
}

您不需要实现onSaveInstanceState()方法,它会自动处理。


我不理解这个行为...为什么即使它并不是当前显示的内容,停止后又会被重新创建?无论如何,我正在尝试遵循你的方法,但我无法弄清楚如何保存状态。 我已经在FragmentonCreateView()中添加了setRetainInstance(true),但onSaveInstanceState()从未被调用。 - sergi
它被再次调用,因为它创建了当前视图左侧和右侧的片段,以便可以使用滑动动画显示它。有关更多详细信息,请参见我的编辑。 - Sapan Diwakar
现在更清楚了,但我不会在onCreate()中处理视图,而是在需要返回一个ViewonCreateView()中进行处理,该View将需要修改以匹配先前的状态。事实上,当我使用myFragment.setRetainInstance(true);时,之前调用的onCreateView()onCreate()不再被调用。 - sergi

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