无法理解FragmentPagerAdapter如何在活动销毁下工作

时间:2014-02-09 23:07:32

标签: android android-fragments android-viewpager

我正在测试我的应用程序,一旦用户离开它就“销毁所有活动”,以模拟操作系统查杀我的应用程序。

在我的主要活动中,在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没有被称为新片段?

1 个答案:

答案 0 :(得分:0)

如果有人遇到此问题,我会解释我的解决方案。基本上发生的事情是在破坏后恢复活动时恢复之前创建的碎片。对于你们中的一些人来说,这可能是 duh 的时刻。

我的问题基本上是对片段的错误引用。

首先,我将setOffscreenPageLimit更改为完整(#tabs - 1)。这意味着所有片段都在开始时创建并保存在内存中。我会解释为什么这会有所帮助。

这意味着在onSaveInstanceState中,我们可以在outState Bundle的所有4个片段上使用putFragment。

在create中,如果savedInstanceState为null,我们可以从头开始创建所有4个片段。否则,您可以对所有4个片段使用getFragment,并将它们放入新的寻呼机适配器以作为参考。

您可能会问为什么我将setOffscreenPageLimit设置为max。我在确定使用putFragment保存哪些片段时遇到了问题。 isAdded()似乎并不总是正常工作,isResumed()也没有,所以更容易保存所有这些因为我们知道所有4个都是创建的并且始终在片段管理器中。