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
相关产品推荐
相关产品推荐

