Jetpack Navigation 实现自定义 View 导航

本文详细介绍了如何在Android应用中使用Jetpack Navigation组件实现自定义View的导航。内容涵盖Navigation的基本构成、工作原理,以及如何创建ViewNavigator、定义自定义属性、ViewDestination、NavigationHostView和NavGraph,并在Activity中设置。通过这个教程,读者可以了解到如何扩展Navigation以支持自定义View的页面跳转。
摘要由CSDN通过智能技术生成

前言

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值