Android片段:真的需要空构造函数吗?

时间:2014-09-22 22:29:42

标签: android android-fragments

我有一个带有寻呼机和FragmentStatePagerAdapter的活动(我需要在很多页面上滑动)。众所周知,这个适配器一次创建3个片段实例,一个要显示,前一个和下一个。

我的活动使用只有一个构造函数的片段工作非常好:它收到了1个参数。测试时,我开始收到臭名昭着的消息:

Unable to instantiate fragment: make sure class name exists, is public, 
and has an empty constructor that is public 

有趣的是,此消息仅在方向更改后才显示,但如果方向仍然存在,应用程序才会正常工作。所以,

  1. 为什么方向不改变时会起作用?
  2. 为什么方向改变时会失败?
  3. 当方向变化与刚刚创建的活动相比,片段生命周期的活动有何不同?
  4. 非常感谢

1 个答案:

答案 0 :(得分:14)

  

是否真的需要空构造函数?

  

为什么方向不改变时会起作用?

因为Android没有尝试重新创建片段。

  

为什么方向改变时会失败?

因为Android正在重新创建片段。

当配置更改发生时(例如,方向更改),默认情况下,Android会销毁并重新创建您的活动,并且还会破坏并重新创建该活动中的片段。 "重新创建片段"部分是为什么你需要片段上的零参数公共构造函数。它也用于其他情况,例如FragmentStatePagerAdapter

或者引用the documentation

  

Fragment的所有子类都必须包含一个公共空构造函数。框架通常会在需要时重新实例化一个片段类,特别是在状态恢复期间,并且需要能够找到此构造函数来实例化它。如果空构造函数不可用,则在状态还原期间的某些情况下将发生运行时异常。