我有一个带有自定义FragmentAdapter的viewpager活动。
这是我的适配器代码:
this.viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
SparseArray<WeakReference<Fragment>> registeredFragments = new SparseArray<>(4);
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
this.registeredFragments.put(position, new WeakReference<>(fragment));
return fragment;
}
@Override
public int getCount() {
return 4;
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
WeakReference<Fragment> ret = this.registeredFragments.get(position);
if (ret == null || ret.get() == null) {
if (position == 0)
ret = new WeakReference<>(new NewGiveawayStepFragment1());
else if (position == 1)
ret = new WeakReference<>(NewGiveawayStepFragment2.newInstance(getUser().getApiFacade().getProfilePicUrl()));
else if (position == 2)
ret = new WeakReference<>(new NewGiveawayStepFragment3());
else if (position == 3)
ret = new WeakReference<>(NewGiveawayStepFragment4.newInstance(getUser().getApiFacade().getProfilePicUrl()));
}
return ret.get();
}
});
想法是在创建片段之后,我将它们存储到SparseArray
中,并避免重新创建它们(我知道我可能具有相同的行为viewPager.setOffscreenPageLimit();
,但这会使活动在第一次加载时花费更长的时间
此想法基于以下答案:
https://stackoverflow.com/a/15261142/5679560
在正常的幸福世界中,一切正常...
问题是,当用户最小化应用程序时-> android决定保存状态并关闭应用程序->他们会恢复应用程序...
在这种情况下,当用户还原应用程序时,将永远不会创建页面setOffscreenPageLimit
因此,请更具体一点:
1位用户加载活动
2用户负载查看页面0
3位用户将应用程序最小化,Android将其关闭
4位用户恢复了应用程序,确定
5位使用者前往检视页面1 OK
6位用户进入浏览页2 instantiateItem
从未被调用getItem
从未被调用并显示空白页面
7位用户前往浏览页面3 instantiateItem
从未被调用getItem
从未被调用并显示空白页面
没有引发异常。如果用户在第1页离开该应用程序,则在恢复时第0,1和2页就可以了,如果用户在第3页离开了,那么第2页和第3页就可以了
这是我的活动onRestoreInstanceState
@Override
public void onRestoreInstanceState(@Nullable Bundle savedInstanceState) {
this.currentPage = savedInstanceState.getInt("currentPage");
this.ignoreSpam = savedInstanceState.getBoolean("ignoreSpam", false);
super.onRestoreInstanceState(savedInstanceState);
}
绝对没什么特别的
有人知道为什么会这样吗?