我正在测试我的应用程序,一旦用户离开它就“销毁所有活动”,以模拟操作系统查杀我的应用程序。
在我的主要活动中,在onCreate中,我实例化所有片段,将它们添加到列表中然后:
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), fragments);
mViewPager = (ViewPager) super.findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
以下是适配器代码:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public SectionsPagerAdapter(FragmentManager fragmentManager, List<Fragment> fragments) {
super(fragmentManager);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0: return getString(R.string.section_one);
case 1: return getString(R.string.section_two);
case 2: return getString(R.string.section_three);
case 3: return getString(R.string.section_four);
}
return null;
}
}
现在,问题(崩溃)就在这里,在一个操作栏项目中:
case R.id.action_refresh:
PostsFragment fragment = (PostsFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem());
fragment.reloadDataFromServer();
说活动已打开,然后在后退按钮上销毁。当我返回此活动并按下刷新操作项时,应用程序崩溃。为什么?再次创建活动时,它会创建一个新的寻呼机适配器,包含所有新的4个片段。但是从未调用onCreate这些片段,没有成员被初始化,因此reloadDataFromServer无法加载到尚未初始化的列表视图中。
但是,先前引用的片段的onCreate被调用,但我们不再引用它们,因为我们使用新片段重新创建了FragmentPagerAdapter。这让我想起了INSANE!为什么onCreate没有被称为新片段?
答案 0 :(得分:0)
如果有人遇到此问题,我会解释我的解决方案。基本上发生的事情是在破坏后恢复活动时恢复之前创建的碎片。对于你们中的一些人来说,这可能是 duh 的时刻。
我的问题基本上是对片段的错误引用。
首先,我将setOffscreenPageLimit更改为完整(#tabs - 1)。这意味着所有片段都在开始时创建并保存在内存中。我会解释为什么这会有所帮助。
这意味着在onSaveInstanceState中,我们可以在outState Bundle的所有4个片段上使用putFragment。
在create中,如果savedInstanceState为null,我们可以从头开始创建所有4个片段。否则,您可以对所有4个片段使用getFragment,并将它们放入新的寻呼机适配器以作为参考。
您可能会问为什么我将setOffscreenPageLimit设置为max。我在确定使用putFragment保存哪些片段时遇到了问题。 isAdded()似乎并不总是正常工作,isResumed()也没有,所以更容易保存所有这些因为我们知道所有4个都是创建的并且始终在片段管理器中。