Navigation

Navigation

使用:https://developer.android.com/guide/navigation

说明

以 Android studio demo 示例为例

默认的 NavController 在构造函数只添加了两个导航器

1
2
3
4
5
public NavController(@NonNull Context context) {
// ...
mNavigatorProvider.addNavigator(new NavGraphNavigator(mNavigatorProvider));
mNavigatorProvider.addNavigator(new ActivityNavigator(mContext));
}

NavHostFragment 中增加了对 FragmentDialog 导航的兼容

1
2
3
4
5
protected void onCreateNavController(@NonNull NavController navController) {
navController.getNavigatorProvider().addNavigator(
new DialogFragmentNavigator(requireContext(), getChildFragmentManager()));
navController.getNavigatorProvider().addNavigator(createFragmentNavigator()); // FragmentNavigator
}

不足

  • 路由中所有的路由节点都需要在 mobile_navigation 声明,在中大型多团队的项目并不友好,具有严重的耦合

    • 解决方式:

      可以通过注解处理器进行解决,将 mobile_navigation 里的参数全部挪到注解中,然后通过在对应的 Activity Fragment Dialog 中进行注解声明,然后注解处理器将注解内容解析成对应的配置文件存放在 assets 目录中,在应用启动时读取该 json 进行手动配置,参考:

      androidx.navigation.NavInflater#inflate(android.content.res.Resources, android.content.res.XmlResourceParser, android.util.AttributeSet, int)

  • FragmentNavigator 中导航使用的是 replace,造成 Fragment 走完整的生命周期,这也是不可接受的

    • 解决方式:

      参考 FragmentNavigator 重新编写一份添加到 NavigatorProvider 中,对 replace 逻辑进行重新编排