java - 由于 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()阶段会出现异常?
解决方案
在 Java 中
如果一个类没有定义任何构造函数,那么在编译时,编译器会生成一个没有参数的构造函数(我们通常称其为默认构造函数、无参数构造函数或零参数构造函数)。
如果一个类定义了任何有参数的构造函数,那么在编译时,编译器将不会生成默认构造函数。
有人可以解释一下为什么 Fragment 必须有一个构造函数?
如果您的片段没有收到任何参数,则不需要定义构造函数。
为什么在 super.onCreate() 阶段会出现异常?
在 Android 中,系统需要重新创建一个 Activity 有几种情况,例如。
当配置更改时,例如用户旋转屏幕方向或更改语言。
当系统内存不足时
当重新创建一个activity时,系统会创建一个新的activity实例,然后调用activity生命周期,第一个是onCreate()
回调。在您的活动(例如 MainActivity)中,您需要调用super.onCreate()
其父项。该语句将恢复由活动管理的所有片段(例如您的案例中的 DatesFragment)。
因为这是 MainActivity 的一个新实例,所以它也需要创建一个所有托管 Fragment 的新实例(包括 DatesFragment)。为此,他们将调用默认参数构造函数。
但是在 DatesFragment 中,您将默认构造函数设置为私有,这意味着它只能在该类内部访问,系统无法调用 DatesFragment 类的构造函数,因此它们会抛出 InstantiationException。
解决方案:
如果您的片段没有收到任何参数,请不要定义任何构造函数
如果您需要将参数传递给片段,请使用默认构造函数和setArguments(Bundle)
推荐阅读
- mysql - 如何生成 MySQL 过程以获取日期范围内的日期,该日期范围增加 1 个月,直到结束日期
- c++ - OpenCL - 访问冲突读取,不是每次
- apache-kafka - Kafka-connect FileStreamSourceConnector 不产生主题
- excel - 在excel中取消选择一行
- laravel - Laravel 分页太慢了
- javascript - jQuery根据选择的值显示文本框
- node.js - 如何在安装 laravel webpack 时修复 errno 71?
- django - 重写 BaseInlineFormset 的删除函数
- java - 如何将子类实例分配给通用(扩展父)对象?
- javascript - TypeError:无法读取反应组件中未定义的属性“getFieldDecorator”