能否通过抽象BaseFragment简化Android Navigation导航图?
方案可行性结论
直接将抽象类BaseFragment作为导航目标写入导航图的方案不可行,原因和你的判断一致:Navigation组件加载目标Fragment时会通过反射调用目标类的无参构造函数完成实例化,抽象类无法被实例化,运行时会直接抛出实例化失败异常。
可落地的低冗余优化方案
你需要减少导航图冗余、适配后续20+子Fragment新增的需求,可以用以下两种成熟方案实现:
方案1:动态目的地配置,导航图仅保留1个通用节点
不需要提前在导航图中写死所有子Fragment的节点,跳转时动态指定目标子类即可:- 导航图中仅保留1个通用节点,不需要配置固定的子类名称
- 跳转时通过代码动态指定目标子类:
val navController = findNavController() val targetDest = NavDestination(navController.navigatorProvider.getNavigator(FragmentNavigator::class.java)) targetDest.id = R.id.common_fragment_dest targetDest.className = TargetSubFragment::class.java.canonicalName navController.navigate(targetDest.id, bundleOf(/* 公共业务参数 */))- 所有公共逻辑统一在
BaseFragment中实现,子Fragment仅需编写差异化业务代码即可。
方案2:静态节点复用公共配置
如果需要保留静态导航节点的类型校验优势,可以将公共的action、入参、出参配置抽到导航图的公共层级,每个子Fragment的节点仅需配置独有的android:name属性,不需要重复写公共配置,单节点仅需2行代码,新增20+个也不会产生过多冗余。
导航图结构参考
原导航图结构:
可落地的简化后导航图结构:
内容的提问来源于stack exchange,提问作者Daniel C Jacobs
相关产品推荐
相关产品推荐

