Android navigation 源码简单分析
NavHostFragment 解析得到mGraphId,将mGraphId传递给 NavController 处理
NavController通过NavInflater解析得到 NavDestination,
NavDestination destination = inflate(res, parser, attrs, graphResId);
if (!(destination instanceof NavGraph)) {
throw new IllegalArgumentException("Root element <" + rootElement + ">"
+ " did not inflate into a NavGraph");
}
并且判断NavDestination是否是NavGraph,使用这类可以找到,我们的第一个根节点必须是NavGraph,也就是我们在navigation.xml 中定义的navigation节点
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@+id/navigation_home">
在NavController.onGraphCreated方法中通过app:startDestination 的id 调到相应的界面,执行跳转
总结:
1.NavHostFragment 解析得到mGraphId,将mGraphId传递给 NavController 处理NavController通过NavInflater解析得到 NavDestination,这类也就是navigation节点,也就是NavGraph这个类,(NavGraph是NavDestination的子类)。
2.NavGraph这个Destination相对比较特殊,他里面维护一个mNodes和mStartDestId,mNodes是一个数组,里面维护的是这个节点下面的其他NavGraph,mStartDestId是要跳转的目的地Id,开始就会跳转到mStartDestId指定的节点。
Navigator<?> navigator = mNavigatorProvider.getNavigator(parser.getName());
final NavDestination dest = navigator.createDestination();
3.Navigator保存在mNavigatorProvider 中,Navigator中有一个静态内部类,通过createDestination创建相应的NavDestination.