我有一个创建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。
我尝试过的事情......
但是,如果注释掉 super.onSavedInstance()的活动,它的工作正常,但这不是我想要的,因为它在少数情况下失败了。
有没有办法,如果我创建一个新的适配器并再次将其设置为viewpager,它应该重新开始,即应该从第一个位置调用getItem()而不会最小化fragmentStateViewPagerAdapter的性能。
任何形式的帮助或建议都将不胜感激。
答案 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,问题就消失了。