页面与页面之间的连线叫 action,它可以配置进离场动画(Animations),也可以配置出栈行为(Pop Behavior),还支持 Single Top 的启动选项(Launch Options)。进离场动画和启动选项很好理解,出栈行为是一个比力强大的功能,action 箭头所指的方向表示目标页面入栈,箭头的反方向则表示目标页面出栈,而出栈的行为在 Navigation 编辑器中完全可控,我们可以指定要出栈到哪个页面,以致可以指定目标页面是否也需要出栈:
针对页面节点,还可以定义它要接收的参数(arguments),支持默认值,从此 Fragment 之间的参数传递变得非常直观,非常安全。
看一下具体用法,首先在跳转发起页面,通过 apt 生成的跳转函数传入参数:
val direction = ActorListFragmentDirections.showDetail(actorId)
findNavController().navigate(direction)
然后使用目标页面生成的 *Args 获取参数:
private val args: ActorDetailFragmentArgs by navArgs()
这里的 navArgs 是一个扩展函数,使用了 Kotlin 的 ReadWriteProperty。
几行代码就搞定了页面之间的跳转,而且还是可视化!从没有想过 Android 的页面跳转竟会变得如何简单,但是 Navigation 的方案并不是原创,iOS 的 Storyboard 很早就支持拖拽生成路由。当年 Android 推出 ConstraintLayout 之时,我们都以为是参考了 Storyboard 的页面拖拽,现在再配上 Navigation,从页面到跳转,一个完备的拖拽链路就形成了。平台虽然有差别化,但是使用场景一致的条件下,解决方案也就殊途同归了。
了解完了与生命周期有关的组件,接下来我们来看细节。
Paging