2014-10-29 102 views
1

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

public static class PlaceHolderFragment extends Fragment { 

    public PlaceHolderFragment() {} 

    ... 
} 

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

回答

0

需要对发生的任何事情打电话给任一片段的静态方法的空构造:

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

Android框架使用这些方法来创建你的XML布局定义的片段。它还将在还原片段的活动状态时使用它们(例如,在方向更改时)。

如果未定义空构造函数,并且上述方法之一被调用,则会得到java.lang.InstantiationException。

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

2

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

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

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

由于在类中定义了参数化构造函数时,人们忘记添加默认构造函数是一种常见的错误。所以android开发人员网站坚持要创建片段中的空构造函数以保证安全。 空的构造函数是否由您生成或提供,只要它存在于片段中并不重要。