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

Android片段:真的需要空构造函数吗?,android,android-fragments,Android,Android Fragments,我有一个活动,里面有一个寻呼机和一个FragmentStatePagerAdapter(我需要在多个页面上滑动)。我们都知道,这个适配器一次创建3个片段实例,一个要显示,一个上一个和一个下一个 使用一个只有一个构造函数的片段,我的活动运行得非常好:它收到了一个参数。测试时,我开始得到一个臭名昭著的信息: Unable to instantiate fragment: make sure class name exists, is public, and has an empty constru

我有一个活动,里面有一个寻呼机和一个FragmentStatePagerAdapter(我需要在多个页面上滑动)。我们都知道,这个适配器一次创建3个片段实例,一个要显示,一个上一个和一个下一个

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

Unable to instantiate fragment: make sure class name exists, is public, 
and has an empty constructor that is public 
有趣的是,这条信息只会在方向改变后立即显示,但如果方向保持不变,应用程序就会工作。所以

  • 当方向不变时,它为什么起作用
  • 为什么方向改变时会失败
  • 当方向改变时,活动片段生命周期与刚创建的活动有什么区别
  • 非常感谢

    真的需要空构造函数吗

    当方向不变时,它为什么起作用

    因为Android并没有试图重新创建你的片段

    为什么方向改变时会失败

    因为Android正在重建你的片段

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

    或者,引用:

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


    如果是这样,为什么框架在重新创建活动和片段时遵循不同的步骤。我的意思是,如果碎片和活动被销毁,为什么不按照第一次采取的相同创建步骤进行呢?@Mark:因为它不能。您在代码中第一次创建了片段。安卓不是你。Android无法识别代码中碰巧执行
    FragmentTransactions
    的随机语句,更不用说以某种方式重放这些语句了。我的意思是,框架正在破坏活动及其内部片段。为什么不重新运行第一次创建的代码?@Mark:因为Android不知道你的代码在哪里。例如,您可能添加了一个片段以响应操作栏项。确切地说,你希望Android如何知道它需要假装点击一个动作条来重新创建那个片段?那么,你在操作条项目处理程序中拥有的所有其他逻辑会被重新执行吗?好的,明白了。我的应用程序目前很简单,所以我没有遇到过这样的情况。谢谢你的耐心!!