首页 > 解决方案 > 由于 Fragment 类中缺少公共构造方法,在 android 中旋转设备后出现异常

问题描述

我用一个包含片段的 Activity 编写了一个非常简单的程序。我将Fragment构造函数设为私有,并且我使用静态 newInstance()方法返回片段。当我旋转手机时,问题就开始了。我收到一个例外,上面写着:

无法启动活动 ComponentInfo{com.example.todeleteimmediatley/com.example.MainActivity}:androidx.fragment.app.Fragment$InstantiationException:无法实例化片段 com.example.DatesFragment:找不到片段构造函数

我调试了程序,发现异常在onCreate方法的第一行(调用super.onCreate()时)。有人可以解释一下为什么 Fragment 必须有构造函数,为什么在super.onCreate()阶段会出现异常?

标签: javaandroidandroid-fragmentsandroid-activityoncreate

解决方案


在 Java 中

  • 如果一个类没有定义任何构造函数,那么在编译时,编译器会生成一个没有参数的构造函数(我们通常称其为默认构造函数、无参数构造函数或零参数构造函数)。

  • 如果一个类定义了任何有参数的构造函数,那么在编译时,编译器将不会生成默认构造函数。

有人可以解释一下为什么 Fragment 必须有一个构造函数?

如果您的片段没有收到任何参数,则不需要定义构造函数。

为什么在 super.onCreate() 阶段会出现异常?

在 Android 中,系统需要重新创建一个 Activity 有几种情况,例如。

  • 当配置更改时,例如用户旋转屏幕方向或更改语言。

  • 当系统内存不足时

当重新创建一个activity时,系统会创建一个新的activity实例,然后调用activity生命周期,第一个是onCreate()回调。在您的活动(例如 MainActivity)中,您需要调用super.onCreate()其父项。该语句将恢复由活动管理的所有片段(例如您的案例中的 DatesFragment)。

因为这是 MainActivity 的一个新实例,所以它也需要创建一个所有托管 Fragment 的新实例(包括 DatesFragment)。为此,他们将调用默认参数构造函数。

但是在 DatesFragment 中,您将默认构造函数设置为私有,这意味着它只能在该类内部访问,系统无法调用 DatesFragment 类的构造函数,因此它们会抛出 InstantiationException。

解决方案:

  • 如果您的片段没有收到任何参数,请不要定义任何构造函数

  • 如果您需要将参数传递给片段,请使用默认构造函数和setArguments(Bundle)


推荐阅读