目录
1.官网正式概念
1.1 初认知
2.导入依赖
2.2 safe Args插件-> 传递数据时用
3.1 搭建初始框架
3.2 确定action箭头的属性
3.5 数据传递(单向)
3.5.2 safe Args插件
3.6 数据实时共享(双向,简略提及)
1.官网正式概念
1.1 初认知
大白话来讲:就是控制多fragment直接的切换,其中涉及数据的传递与更新,动画和内存堆栈,也需要了解Fragment的生命周期
2.导入依赖
2.1 使用navigation
dependencies {implementation("androidx.navigation:navigation-fragment-ktx:2.6.0")implementation("androidx.navigation:navigation-ui-ktx:2.6.0")}
2.2 safe Args插件-> 传递数据时用
plugins {id("androidx.navigation.safeargs.kotlin")id ("kotlin-android-extensions") }plugins {id("androidx.navigation.safeargs") version "2.6.0" apply false }
看晕了? :结合下图依次加上集成环境
3.使用Navigation
3.1 搭建初始框架
新建Android Resource Directory, type选择navigation
在Navigation Resource File确定fragment间导航关系
箭头是直接从一个fragment拖动到另一个点连接的,代表有一个action_from箭头尾_to头部
3.2 确定action箭头的属性
1.设置动画
enterAnim: 跳转时的目标页面动画
exitAnim: 跳转时的原页面动画
popEnterAnim: 回退时的目标页面动画
popExitAnim:回退时的原页面动画
2.传递的变量的默认值——》这个要在Fragment先设置接收,才有此属性3.栈管理
popUpTo :手动弹栈,将选定fragment,在栈钟上方的所有全部弹出
popUpInclusive: 默认false, 选中ture代表popUpTo时包括选定的fagment一起弹出栈
这里假设 导航为 A->B->C->A
lauchSingleTop : 若此为ture, 跳转到的Fragment与栈顶相同,则复用栈顶Fragment
3.3 为Activity添加NavHostFragment控件
注意navGraph一定要正确
3.4 NavController 管理应用导航的对象
一般在Fragment切换就行
切换方法:(这里action即是 目录3.2 的内容)
3.5 数据传递(单向)
3.5.1 最简单,也是Navigation自带的Bundle
val navController = Navigation.findNavController(it)
val bundle = Bundle()
bundle.putString("key", "test")
navController.navigate(R.id.action_fragmentA_to_fragmentB2, bundle)
接收
arguments?.getString("数据的key")
3.5.2 safe Args插件
这个需要添加插件 -》 详细参考 本文目录 2.2
当传递数据为自定义类 -》还需要序列化接口
id 'kotlin-parcelize'
在nav_graph中 接收数据的Fragment 的Argument中 设置接受数据名字,类型和默认值
如Fragment_A -> Fragment_B 就是将数据当参数传入action
binding.ivAdd.setOnClickListener {val action = HomeFragmentDirections.actionHomeFragmentToDrawFragment(User("zhoujun"))findNavController().navigate(action) }
接收数据
arguments.getString(数据的key) arguments.getParcelable(数据的key)
3.6 数据实时共享(双向,简略提及)
自定义ViewModel类和属性
封装供外界修改数据的方法
作用:把所有viewModel统一,数据即使共享的