【问题标题】:fragment onAttach(context :Context) is not called片段 onAttach(context :Context) 未被调用
【发布时间】: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()

标签: android android-fragments


【解决方案1】:

您的问题是您尝试在片段事务执行之前访问上下文,因为您使用commit()。修复它的简单方法是使用commitNow()。

【讨论】:

  • 太棒了!它运行良好,我将研究 commit 与 commitNow,谢谢!!
  • 实际上,当您调用 commit 时,它会安排您的事务,而不是立即执行。
猜你喜欢
  • 2016-05-21
  • 2015-11-11
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2018-01-30
  • 2017-11-19
相关资源
最近更新 更多