ChildFragment的parentFragment返回NavHostFragment而非实际父Fragment
当前页面Fragment嵌套结构如下:
Activity NavHostFragment (绑定navigation导航图) Fragment1 ChildFragment Fragment2 ChildFragment Fragment3
需求为在ChildFragment中访问对应的直接父Fragment(即动态承载它的Fragment1或Fragment2),但实际调用parentFragment时返回的是NavHostFragment,不符合预期。
限制条件:无法通过固定id或tag直接查找Fragment1/Fragment2,因为ChildFragment的父级是动态变化的,无法提前获知父Fragment的id或类名,同时不希望通过Fragment参数传递父级信息的方案实现。
parentFragment返回NavHostFragment的核心原因是嵌套Fragment加载时使用了错误的FragmentManager:
Navigation组件的navigate()方法操作的是NavHostFragment持有的FragmentManager栈,所有通过该方法加载的Fragment,都会被作为NavHostFragment的直接子Fragment,与Fragment1、Fragment2处于同一层级,自然无法获取到预期的直接父级。
不要使用全局导航控制器加载嵌套的ChildFragment,在父Fragment(Fragment1/Fragment2)中加载ChildFragment时,使用父Fragment自身的childFragmentManager执行Fragment事务即可,代码示例:
// 在Fragment1或Fragment2中加载ChildFragment的正确写法 childFragmentManager.commit { replace(R.id.child_container_view, ChildFragment()) addToBackStack(null) }
按上述方式加载后,在ChildFragment的onAttach及之后的生命周期中调用parentFragment,会直接返回当前承载它的直接父Fragment(Fragment1或Fragment2),不需要提前预知父Fragment的id、tag或类名,也不需要通过参数额外传递父级引用。
- 不要通过遍历Fragment栈的方式查找父级,这种方式在导航栈变化、生命周期异常时容易触发类型转换错误或空指针。
- 不要在
onAttach之前的生命周期(如Fragment构造函数)调用parentFragment,此时Fragment还未完成与父级的绑定,会返回null。
内容的提问来源于stack exchange,提问作者htafoya

