You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment附着宿主后FragmentOnAttachListener未每次触发回调问题咨询

FragmentOnAttachListener 二次附着无回调问题排查

问题根因

  • 监听器绑定的FragmentManager层级不匹配
    你将FragmentOnAttachListener添加到了Activity的supportFragmentManager,该监听器仅能接收直接附着到Activity顶级FragmentManager的Fragment的附着事件。使用Navigation Component时,所有业务页面Fragment都托管在NavHostFragment的childFragmentManager下,不属于Activity顶级FragmentManager的直接子节点。你首次启动收到的回调实际是NavHostFragment本身附着到Activity的回调,并非业务页面Fragment的回调,因此后续操作业务Fragment时无法收到事件。
  • 手动刷新的附着事件仅触发对应宿主FragmentManager的回调
    你手动触发Fragment刷新(如detach+attach操作、导航回退重入等)时,业务Fragment的宿主始终是NavHostFragment的childFragmentManager,只有给该层级的FragmentManager添加监听器,才能捕获对应附着事件。

解决方案

方案1:绑定NavHostFragment的childFragmentManager(适配Navigation场景)

在BaseActivity的onCreate中,获取NavHostFragment的childFragmentManager并添加监听器即可捕获所有业务页面Fragment的附着事件:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    _binding = getViewBinding()
    setContentView(_binding!!.root)
    // 绑定Navigation宿主的FragmentManager,R.id.nav_host_fragment需和布局中NavHostFragment的id一致
    val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val listener = FragmentOnAttachListener { _, fragment ->
        // 响应Fragment附着事件
    }
    navHost.childFragmentManager.addFragmentOnAttachListener(listener)
}

方案2:全层级监听(适配嵌套Fragment场景)

如果需要监听所有层级(包括多层嵌套子Fragment)的附着事件,可在每次收到Fragment附着回调时,同步给当前Fragment的childFragmentManager也添加相同的监听器即可。

内容的提问来源于stack exchange,提问作者Reyhane Farshbaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:18:01