我有一个带有寻呼机和FragmentStatePagerAdapter的活动(我需要在很多页面上滑动)。众所周知,这个适配器一次创建3个片段实例,一个要显示,前一个和下一个。
我的活动使用只有一个构造函数的片段工作非常好:它收到了1个参数。测试时,我开始收到臭名昭着的消息:
Unable to instantiate fragment: make sure class name exists, is public,
and has an empty constructor that is public
有趣的是,此消息仅在方向更改后才显示,但如果方向仍然存在,应用程序才会正常工作。所以,
非常感谢
答案 0 :(得分:14)
是否真的需要空构造函数?
是
为什么方向不改变时会起作用?
因为Android没有尝试重新创建片段。
为什么方向改变时会失败?
因为Android正在重新创建片段。
当配置更改发生时(例如,方向更改),默认情况下,Android会销毁并重新创建您的活动,并且还会破坏并重新创建该活动中的片段。 "重新创建片段"部分是为什么你需要片段上的零参数公共构造函数。它也用于其他情况,例如FragmentStatePagerAdapter
。
或者引用the documentation:
Fragment的所有子类都必须包含一个公共空构造函数。框架通常会在需要时重新实例化一个片段类,特别是在状态恢复期间,并且需要能够找到此构造函数来实例化它。如果空构造函数不可用,则在状态还原期间的某些情况下将发生运行时异常。