销毁活动时ViewPager和FragmentStatePagerAdapter的问题

时间:2016-10-12 12:38:39

标签: android-fragments android-viewpager fragmentstatepageradapter

我有一个创建viewpager适配器(FragmentStatePagerAdapter)的活动,并将viewpager设置为此适配器。

这是viewpager适配器的创建方式,并设置为viewpager小部件。

viewPageAdapter = new viewPageAdapter(getSupportFragmentManager(), getApplicationContext());

mCustomSwipeViewPager.setAdapter(viewPageAdapter);

这就是我创建viewPageAdapter的方式

public class viewPagerAdapter extends FragmentStatePagerAdapter {


    private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

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

    @Override
    public Fragment getItem(int position) {
        // returning newly created fragment
    }

    @Override
    public int getCount() {
        // returning total count
    }


    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        // This is where i am putting created fragment in the sparse array,
        // which i will be accessing in the activity based on position
        // for updating fragment views.
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // And here i am removing it from the sparse array
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }
}

现在,我去了开发者选项并检查了“Donot keep activities”。

这就是问题的开始,在推进此活动后,此活动将被销毁,这很好。

现在,如果我回来,在onCreate()中创建一个新的适配器并设置为viewpager,但它不再调用 getItem(),而是调用 instantiateItem( ),内存中的片段为null。

我在调试模式下检查了 fragmentmanager ,片段管理器将两个片段保存为 activestate ,所有片段字段都为null。

我尝试过的事情......

  • 尝试使用在 onDestroy()中清除片段管理器 fragmentManager.getFragments.clear()但没有运气。
  • 将适配器的getItemCount()设置为0并在onDestroy()上的适配器上调用notifydatasetChanged(),仍然相同。

但是,如果注释掉 super.onSavedInstance()的活动,它的工作正常,但这不是我想要的,因为它在少数情况下失败了。

有没有办法,如果我创建一个新的适配器并再次将其设置为viewpager,它应该重新开始,即应该从第一个位置调用getItem()而不会最小化fragmentStateViewPagerAdapter的性能。

任何形式的帮助或建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我想出的唯一解决方案是在 onSaveInstanceState(Bundle outState)回调活动生命周期内注释掉默认的 super.onSaveInstanceState(outState)

@Override
protected void onSaveInstanceState(Bundle outState) {
   //        super.onSaveInstanceState(outState);
}

这样做不会将片段旧实例保留在 viewpager fragmentManager 中,并会重新开始。

我无法想到任何更好的解决方案,因为片段内部和活动中都有许多全局变量,它是演示者,并将它们保存在 onSaveInstanceState 他们在onCreate或 onRestoreInstanceState()中恢复它们对我来说会非常沉重。

任何比这更好的解决方案或方法仍然值得注意。

答案 1 :(得分:0)

如果出现同样的问题,就是以编程方式为片段的视图容器分配id,我们删除了它并在其布局XML文件中分配了一个id,问题就消失了。

相关问题