ViewPager + Fragment + saveInstanceState

时间:2014-03-03 14:49:32

标签: android android-fragments android-lifecycle

我有一个包含ViewPager的简单Activity,它显示Fragments。

我的活动应该显示有关足球联赛的信息,每个片段都会显示像livescro / matchdays,table等信息。

我启动活动的意图包含联盟ID。

每个片段都需要这个联盟ID来加载正确的数据。

所以我的FragmentPagerAdapter看起来像这样

public class LeaguePagerAdapter extends FragmentPagerAdapter {

    private String leagueId;

    public LeaguePagerAdapter(FragmentManager fm, String leagueId) {
        super(fm);
        this.leagueId = leagueId;
    }

    @Override
    public Fragment getItem(int pos) {
        if (pos == 0){
            return TableFragment.newInstance(leagueId);
        } else {         
            return MatchdayFragment.newInstance(leagueId);
        }
    }
}

TableFragment看起来像这样(比赛日片段看起来很相似):

public class TableFragment extends PullToRefreshListViewAdFragment {

    private String leagueId;

    public static TableFragment newInstance(String leagueId) {
        TableFragment t = new TableFragment();
        t.leagueId = leagueId;
        return t;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
              // Setup UI and load data
        }
}

有时联盟ID为空。我在崩溃日志(crittercism)中看到了异常。但我问自己为什么。在我看来,问题是当活动在后台被销毁并重建时(例如)用户使用多任务按钮切换到我的应用程序。

据我所知,如果Activity已被破坏,原始的Intent将由Android本身存储在内部。因此,我没有在我的活动中或片段中实现任何onSaveInstanceState()。在我的活动中,我阅读了Intent Extra来检索leagueId。这很好,也适用于恢复活动。我假设通过重新创建活动,将创建一个新的LeaguePagerAdapter,并且所有片段也将是新创建的。

这是对的吗?或者“旧的”片段实例是否会被恢复,因此leagueId为null(因为片段没有存储在Fragments onSaveInstanceState方法中的leagueId?)。

有没有办法测试这样的生命周期事物

1 个答案:

答案 0 :(得分:0)

它为null的原因是因为系统使用默认构造函数恢复Fragment。这是文件说的:

  

每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。

编辑:另外,请看一下:Fragment's onSaveInstanceState() is never called

编辑:要进一步添加,您将使用newInstance(String)方法创建片段。如果您的Fragment被Android杀死,它将使用默认构造函数,因此您的leagueId变量将不会被设置。尝试使用setArguments / getArguments将值传递到您的片段中。