当重新创建Activity时,lateinit属性不会被初始化
在我的活动我有一个lateinit
属性称为controller
,我的片段使用。 该属性在Activity.onCreate()
初始化。 我的Fragment
通过onAttach()
获取其参考。 然后Fragment
在Fragment.onCreate()
调用myActivity.controller
。
通常controller
首先在Activity.onCreate()
初始化,然后添加Fragment
。 所以这工作得很好。
但是,当我的Activity
被杀害,它试图重新创建自己和它的碎片。 这导致在Activity.onCreate()
初始化之前调用Fragment.onCreate()
Activity.onCreate()
。
这些是我现在看到的选项:
- 在
super.onCreate()
之前初始化controller
(如果甚至可能的话) - 将调用移动到
myActivity.controller
到更高的生命周期回调,如onViewCreated()
- 在Kotlin 1.2中有
::controller.isInitialized
这里我最好的选择是什么?
通过回顾Fragment
生命周期 ,实际上最安全的做法是#onActivityCreated(android.os.Bundle)
。
即使#onAttach()
看起来像Fragment
附加到Activity
时调用,我不知道这是完全保证,因为旧的#onAttach(android.app.Activity)
已被弃用,而新的#onAttach(android.content.Context)
建议使用#onAttach(android.content.Context)
。
处理初始化之前使用对象的这种情况的最佳方法是使用isInitialized()属性进行检查,然后使用它。
- 在MaterialDateTimePicker中禁用每个月的星期日
- Android的TextInputLayout提示重叠EditText提示
- Kotlin应用程序不显示我的JSON数组
- Kotlin IllegalStateException:在类路径中找不到资源:kotlin / .kotlin_string_table
- Kotlin stdlib和Databinding
- Kotlin Dagger2找不到符号ApplicationModule_ProvideApplicationFactory
- 什么id名称约定是好的Kotlin机器人扩展
- Kotlin:何时以及如何使用Lambda表达式
- 编译失败,出现模糊的错误