【问题标题】:Issue with ViewPager and FragmentStatePagerAdapter when activity is destroyed销毁活动时 ViewPager 和 FragmentStatePagerAdapter 的问题
【发布时间】:2016-10-12 12:38:38
【问题描述】:

我有一个创建 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);
    }
}

现在,我转到开发者选项并选中“不保留活动”。

问题就从这里开始了,往前推进这个activity,这个activity会被销毁,这很好。

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

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

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

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

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

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

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

【问题讨论】:

标签: android-fragments android-viewpager fragmentstatepageradapter


【解决方案1】:

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

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

这样做不会将片段旧实例保留在 viewpagerfragmentManager 中,而是重新开始。

我想不出更好的解决方案,因为片段内部和活动中以及它的演示者中有许多全局变量,并将它们保存在 onSaveInstanceState bundle 他们在 onCreate 或 onRestoreInstanceState() 中恢复它们对我来说非常繁重。

任何比这更好的解决方案或方法仍然是可观的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多