2014-09-22 81 views
4

我有一个页面和一个FragmentStatePagerAdapter里面的活动(我需要滑过很多页面)。众所周知,该适配器一次创建3个片段实例,即要显示的片段实例,前一个和下一个片段实例。Android碎片:是空的构造函数真的需要吗?

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

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

有趣的是,这个消息只是方向更改后正确显示出来,但如果方向保持静止的应用只是工作。所以,

  1. 为什么它的工作方向不会改变?
  2. 为什么方向改变时会失败?
  3. 定向变化与刚刚创建的活动相比,片段生命周期中活动的差异是什么?

非常感谢

回答

12

是空的构造真正需要的?

是的。

为什么它在方向不变时工作?

因为Android没有尝试重新创建您的碎片。

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

因为Android正在重新创建您的碎片。

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

或者引用the documentation

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

+0

如果是这样,为什么框架在重新创建活动和片段时遵循不同的步骤。我的意思是,如果碎片和活动被破坏,为什么不按照第一次采取的相同的创作步骤? – 2014-09-23 14:24:08

+2

@Mark:因为它不能。 *您*在您的代码*中第一次创建了片段。 Android不是你。 Android无法在您的代码中识别出执行'FragmentTransactions'的随机语句,更不用说以某种方式重播这些语句。 – CommonsWare 2014-09-23 14:26:19

+0

我的意思是,框架正在破坏活动及其内部碎片。为什么不重新运行相同的代码,就像创建第一次一样? – 2014-09-23 20:33:46