我有一个包含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?)。
有没有办法测试这样的生命周期事物
答案 0 :(得分:0)
它为null的原因是因为系统使用默认构造函数恢复Fragment。这是文件说的:
每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。
编辑:另外,请看一下:Fragment's onSaveInstanceState() is never called
编辑:要进一步添加,您将使用newInstance(String)
方法创建片段。如果您的Fragment被Android杀死,它将使用默认构造函数,因此您的leagueId
变量将不会被设置。尝试使用setArguments
/ getArguments
将值传递到您的片段中。