两个相似BottomSheet为何分别需childFragmentManager和parentFragmentManager?
核心逻辑:FragmentResult的传递规则
Fragment的setFragmentResult结果传递严格遵循Fragment添加层级:如果一个Fragment通过FragmentX的getChildFragmentManager()添加,它的结果会发送给FragmentX,此时FragmentX需要在自己的getChildFragmentManager()上注册监听器才能接收。但如果添加时getChildFragmentManager()尚未初始化,系统会自动 fallback 到FragmentX的getParentFragmentManager()挂载Fragment,结果就会发送到上层管理器。
你的两种场景差异分析:
FragmentA中直接调用show
你大概率是在FragmentA生命周期早期(比如onAttach、构造方法阶段)调用了show(getChildFragmentManager(), null)。此时FragmentA的子FragmentManager还未完成初始化,BottomSheetDialogFragment内部会自动改用FragmentA的父管理器(Activity或FragmentA所在父Fragment的管理器)来挂载自己。因此结果会发送到这个上层管理器,你必须用getParentFragmentManager()才能监听到。MyUtility中调用show
这种场景下,FragmentA已经走完早期生命周期(比如调用时机在onViewCreated之后),getChildFragmentManager()完全就绪,BottomSheet被正确挂载到FragmentA的子FragmentManager上。结果会直接发送到这个子管理器,所以你需要用getChildFragmentManager()来监听。
统一行为的解决方法
把两种场景下的show()调用时机,都延后到FragmentA的onViewCreated()或之后的生命周期阶段(比如按钮点击事件中),这样BottomSheet都会被正确添加到FragmentA的子FragmentManager中,你只需要统一在getChildFragmentManager()上注册结果监听器即可。
内容的提问来源于stack exchange,提问作者user21193451

