【问题标题】:Empty Constructor for Extended Fragment扩展片段的空构造函数
【发布时间】:2014-10-29 03:11:36
【问题描述】:

根据Android developers website,“每个片段都必须有一个空的构造函数,因此它可以在恢复其活动状态时被实例化”。因此,在新的示例项目中,它们具有如下片段实例化:

public static class PlaceHolderFragment extends Fragment {

    public PlaceHolderFragment() {}

    ...
}

对于非静态片段类,这是否必要(鼓励?)?实际上,我不太明白空构造函数将如何帮助恢复活动状态。我有许多没有空构造函数的自定义对话框片段,但它们没有问题。如果我不为扩展片段提供空构造函数,可能会产生什么后果?

【问题讨论】:

    标签: java android android-fragments constructor


    【解决方案1】:

    建议在fragment类中有一个空的构造函数,因为在某些情况下,比如屏幕旋转,Android系统会调用你的fragment的空构造函数来重新创建你的fragment。

    为了回答您的问题,只要您的片段中没有任何参数化的构造函数,即使您不提供空构造函数,您的应用也可以运行。这是因为当你在类中不提供任何构造函数时,java编译器会自动添加一个空的构造函数。

    如果您在类中定义了任何参数化构造函数,编译器不会自动添加空构造函数。在这种情况下,如果您知道有人会创建一个不带参数的类的对象,则必须显式定义一个空的构造函数。这是通用的 java 编译器行为,并非只针对 android。

    由于在类中定义了参数化构造函数时,人们忘记添加默认构造函数是一个常见错误。所以android开发者网站坚持在fragment中创建空构造函数以更安全。 空的构造函数是由你生成还是由你提供的,只要它存在于片段中即可。

    【讨论】:

      【解决方案2】:

      任何碰巧调用这些静态 Fragment 方法的任何事情都需要空构造函数:

      public static Fragment instantiate (Context context, String fname)
      public static Fragment instantiate (Context context, String fname, Bundle args)
      

      Android 框架使用这些方法来创建在您的 XML 布局中定义的片段。它还会在恢复 Fragment 的 Activity 状态时使用它们(例如,在方向改变时)。

      如果你没有定义一个空的构造函数,并且上面提到的方法之一被调用,你会得到一个 java.lang.InstantiationException。

      如果您查看 Fragment 源代码,您会发现这些方法调用了 Fragment 类的 newInstance() 方法。这需要一个公共的空构造函数。

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 2013-05-29
        • 1970-01-01
        • 2013-11-15
        相关资源
        最近更新 更多