美文网首页
Navigation原理分析

Navigation原理分析

作者: shuixingge | 来源:发表于2018-07-24 23:52 被阅读64次

    原理

    通过解析定义在xml布局的各个节点的视图关系,进行页面跳转时调用原生API进行页面切换(Fragment:FragmentManager,Activity Intent)

    UML图

    核心类

    1:NavGraphFragment
    (1)作为Fragment导航界面的载体
    (2)管理并控制导航的行为(委托给NavController)
    (3)导航关系的入口

    image.png
    创建时机最早,在NavInflater解析的时候通过反射创建,这个类仅仅作为Fragment导航界面的载体,并没有实际承担导航行为,而是将并将导航行为 委托 NavController的实例。
    NavController什么时机创建的?一个NavGraphFragment有几个NavController,怎么个对应关系?
    在onCreate创建
    NavController.onCreate.png
    通过根布局的 tag对应
    onCreateView
    一个NavGraphFragment只有一个NavController
    findNavController(View).png

    findNavController(View)内部实现是通过 遍历 View树,直到找到最底部NavHostFragment 中的NavController对象,并将其返回的,NavHostFragment 在其 作用域 内,理应 有且仅有一个NavController 的实例。

    2:NavController: 导航行为的管家
    (1).对navigation资源文件夹下nav_graph.xml的 解析
    (2).通过解析xml,获取所有 Destination(目标点)的 引用 或者 Class的引用
    (3).记录当前栈中 Fragment的顺序
    NavController 持有了一个 NavInflater ,并通过 NavInflater 解析xml文件。
    这之后,获取了所有 Destination(在本文中即Page1Fragment , Page2Fragment , Page3Fragment ) 的 Class对象,并通过反射的方式,实例化对应的 Destination,通过一个队列保存. 提供了navigation(),onHandleDeepLink(),popBackStack()
    NavController 获取了所有 NavDestination 的Class对象,但是我不负责它 如何实例化 ,也不负责 如何导航 ,也不负责 如何后退 最后通过FragmentNavigator来执行具体的popBackStack()和navigation()

    image.png

    3:Navigator和NavDestination
    Navigator(导航者) 的职责很单纯:
    (1).能够实例化对应的 NavDestination
    (2).能够指定导航
    (3).能够后退导航

    image.png

    NavDestination代表导航视图中的任一一个导航的节点(FragmentNavigator.Destination和ActivityNavigator.Destination),每种和对应的Navigator关联,内部类,主要存储一些Action的信息.


    image.png

    (4):Navigation:对外暴露的API入口,提供NavController的静态方法


    image.png

    5:其他类
    (1) NavInflater:布局解析,初始化各个NavDestination
    (2) NavigationProvider:NavigationProvider存储 Navigator
    6 :借鉴之处
    (1)类职责划分清晰
    (2)面向接口,扩展性强

    相关文章

      网友评论

          本文标题:Navigation原理分析

          本文链接:https://www.haomeiwen.com/subject/gdjumftx.html