【发布时间】:2020-09-05 14:53:16
【问题描述】:
我看到很多人使用 fragmentManager 来进行活动片段调用。所以我也试过了。当我首先单击工具栏时,出现这样的错误。
kotlin.UninitializedPropertyAccessException: lateinit property mActivity has not been initialized
即使我重写并初始化了该方法,在启动 onAttach 时也看不到日志。为什么我无法初始化活动?我的片段是 DaggerFragment。
主按钮点击
binding.toolbar.setOnClickListener {
currentFramgnet = MainPictureFragment().instance
changeFragment(this@MainActivity, binding.fragmentContainer, currentFramgnet!!)
(currentFramgnet as MainPictureFragment).changeDataset("button OnClick")
}
主要变化片段
fun changeFragment(activity: AppCompatActivity, view: View, fragment: Fragment) {
val fragmentManager = activity.supportFragmentManager
fragmentManager
.beginTransaction()
.replace(view.id, fragment)
.commit()
}
片段变化数据集
fun changeDataset(mes : String){
showLog("changeDataset : "+mes)
showToast(mActivity,"11111")
}
附加片段
private lateinit var mActivity :Activity
override fun onAttach(context: Context) {
super.onAttach(context)
showLog("onAttach")
if (context is Activity) mActivity = context
}
更新:我记录了这个,发现 changeDataset 是在 onAttach() 之前调用的
D/TAG: changeDataset : button OnClick
D/TAG: onAttach
【问题讨论】:
-
您最有可能访问
mActivity变量之前 它在onAttach生命周期挂钩中声明 - 我建议您应该删除lateinit修饰符并标记它可以为空。 -
除此之外,您无需自己管理私人活动字段。只需在必要时使用
requireActivity()。 -
我改成这样
private var mActivity :Activity?=null。但结果是一样的。我有空异常。我也更改了`showToast(requireActivity(),"11111")`,但结果相同.. -
我必须使用类 MainFragment(context : Context) 吗?我刚刚使用了类 MainFragment()