前言
Navigation 是 Jetpack 的重要组件之一,用来组织 App 的页面跳转。由于官方推荐使用 Framgent 承载页面的实现,所以一提到 Navigation 首先想到配合 Fragment 使用。其实 Navigation 优秀的设计使其支持任意类型的页面跳转,哪怕是一个自定义 View。
本文就介绍一下 Navigation 中 View 的使用。进入正题之前,自回顾一下 Navigation 的基本情况
Navigation 基本构成
Navigation 的使用中涉及以下几个概念:
-
NavGraph :通过 XML 来设计 APP 各页面(Destination)之间的跳转路径,Android Studio 也中专门提供了编辑器用来编辑 Graph
-
NavHost: NavHost 是一个容器,用来承载 Graph 中的所有节点。Navigation 针对 Fragment 提供了 NavHos t的默认实现 NavHostFragment,可以理解 Graph 中的所有的 Fragment 都是其 ChildFragment 。 本文介绍的自定义 View 的场景中,也需要定义针对自定义 View 的 NavHost
-
NavController: 每个 NavHost 都有一个 Controller,服务于 NavHost 中各节点之间的跳转和回退
-
Navigator: Controller 通过调用 Navigator 实现具体跳转,Navigator 承担了跳转逻辑的实现
Navigation 工作原理
Navigation 中每个页面都是一个 Destination,可以是 Fragment、Activity 或者 View。每个 Detnation 都有唯一 dest id 进行标识,通过 Action 中查找 id 可以实现 当前 Destination 往目标 Destination 的跳转。
类似 MainActivity 一样,APP 启动时需要定义一个起始 Destination 作为首页。
前面介绍过,NavHost 面向不同 Destination 都有具体实现,NavController 也根据 Destination 的类型有不同获取方式,但都很类似:
- Fragment.findNavController()
- View.findNavController()
- Activity.findNavController(viewId: Int)
获取 Controller 后,通过其方法 navigate(int)
进行跳转,例如
findNavController().navigate(R.id.action_first_view_to_second_view)
findNavController().navigate(R.id.second_view)
Navigation for View
前面介绍了 Navigation 的基本构成和工作原理,接下来进入正题,实现基于自定义View 的 Navigation。
需要实现以下内容:
- ViewNavigator
- Attributes for ViewNavigator
- ViewDestination
- NavigationHostView
- Graph file
ViewNavigator
Navigation 提供了自定义 Navigator 的方法:使用 @Navigator.Name
注解。 我们定义一个名字为 screen_view
的 Navigator,在 Graph 的 x