Android navigation 源码简单分析笔记

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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值