根据Android developers website,“每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化”。所以在新的示例项目中,他们有片段实例化,如下所示:
public static class PlaceHolderFragment extends Fragment {
public PlaceHolderFragment() {}
...
}
对于非静态片段类,这是否必要(鼓励?)?实际上,我不太清楚空构造函数如何帮助恢复活动状态。我有许多自定义对话框片段没有空构造函数,但它们没有问题。如果我不为扩展片段提供空构造函数会产生什么后果?
答案 0 :(得分:3)
建议在fragment类中使用空构造函数,因为在某些情况下,如屏幕旋转,Android系统将调用片段的空构造函数来重新创建片段。
要回答您的问题,只要您的片段中没有任何参数化构造函数,即使您没有提供空构造函数,您的应用也会有效。这是因为当你不在类中提供任何构造函数时,java编译器会自动添加一个空构造函数。
如果在类中定义了任何参数化构造函数,编译器将不会自动添加空构造函数。在这种情况下,如果您知道某人将创建一个没有参数的类对象,则必须显式定义一个空构造函数。这是一般的java编译器行为,不仅仅适用于android。
由于在类中定义了参数化构造函数时,人们忘记添加默认构造函数是一个常见的错误。因此,android开发人员网站坚持在片段中创建空构造函数以使其更安全。 无论是否由您生成或提供空构造函数都无关紧要,只要它存在于片段中即可。
答案 1 :(得分:0)
任何碰巧调用这些静态Fragment方法的东西都需要空构造函数:
public static Fragment instantiate (Context context, String fname)
public static Fragment instantiate (Context context, String fname, Bundle args)
Android框架使用这些方法创建XML布局中定义的Fragments。它还将在恢复片段的活动状态时使用它们(例如,在方向更改时)。
如果你没有定义一个空构造函数,并且调用上面提到的上述方法之一,你将得到一个java.lang.InstantiationException。
如果查看Fragment源代码,您会看到这些方法调用fragment类的newInstance()方法。这需要一个公共的空构造函数。