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

我有一个带有寻呼机和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. 当方向变化与刚刚创建的活动相比时,片段生命周期的活动有何不同?

非常感谢

真的是空构造函数吗?

是。

当方向不变时,为什么它可以工作?

因为Android不会尝试重新创建您的片段。

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

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

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

或者,引用文档 :

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