目录
2、在需要参数的destination中配置这个界面的参数类型和名称:
一、概念
navigation是一个框架,用于在Android应用中的目标之间导航,该框架提供一致的API,无论目标作为fragment、activity还是其他组件实现
navigation包含navigation graph、navHost、navController三个部分,这三个部分配合使用来实现界面的切换
Navigation graph:一个xml文件,包含了所有的界面的切换(也就是所有导航目的地以及他们之间如何连接)
NavHost:一个容器,显示导航图的一些东西,里面包含当前导航目的地的ui元素,当用户在应用中导航时,实际上是在navHost中对目的地进行切换(实际上navhost是一个抽象类,实现类是navHostFragment)
NavController: 用来管理目的之间的导航,提供了在目的地之间导航、处理深度链接、管理返回栈等方法。
二、使用步骤
1、首先要加入依赖
implementation("androidx.navigation:navigation-ui-ktx:2.6.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.8.3")
2、创建导航图
ResourceManager->点击加号(添加资源到模块)->file name(mian_nav)->可以在create new destination中快速的创建fragment
3、添加navHost将关系显示出来:
使用NavHostFragment将Nav_graph里面的fragment显示出来
4、设置开始的界面
右击->选择set as Start Destionation
如何找到起始界面呢?其实其实界面上会有一个小房子的图标,小房子的图标在哪那就是起始界面。
5、使用navController切换导航栏
1、如何找到navCotroller
注意:在activity和fragment以及view中找到navCotroller中的方法是不一样的
在activity中:
//找到navController
//1、找到对应的NavHostFragment
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView2) as NavHostFragment
//2、得到NavHostFragment管理的NavController
val navController = navHostFragment.navController
//3、使用vav_graph里面的action实现切换
navController.navigate(R.id.action_homeFragment_to_detailFragment)
在fragment中找到导航栏控制器
val navController = findNavController()
知道了一个view找到导航栏控制器:
mBinding.root.findNavController()
2、实现导航栏的切换
普通切换
navController.navigate(R.id.action_homeFragment_to_detailFragment)
使用选项(navoptions)进行导航:(也可以在xml下的action那里设置)切换的一些具体操作
binding.textView2.setOnClickListener {
findNavController().navigate(R.id.action_welcomeFragment_to_homeFragment,null, navOptions {
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
})
}
}
6、切换回来(也是一样的):
只要有那根线就可以了
7、管理堆栈信息:
在进行导航切换时,通常会将每一个界面(或视图)压入一个栈中,这个栈称为“导航栈”。每当用户导航到新界面时,新的界面会被推入栈顶。当用户后退时,当前界面会被弹出栈,返回到之前的界面。
popUpTo:将这个栈上面的界面全部弹出
而popUpToInclude:是否将自己也弹出栈,true是弹出,弹出了就回不来了
注意: 在导航切换回来时如果没有设置singTop就会在栈顶重新生成一个新的界面
但当singleTop为true如果栈顶有一个相同的就不会在重新生成
singleTop是在action中设置
8、在目的地之间传递数据:
1、添加插件:
适用于Java或Java和kotlin混编的模块:
plugins {
id 'androidx.navigation.safeargs'
}
仅适用于kotlin的模块:
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
同时还要在grable里配置一下这个:
plugins {
id("com.android.application") version "8.7.2" apply false
id("org.jetbrains.kotlin.android") version "1.8.0" apply false
id ("androidx.navigation.safeargs") version "2.8.3" apply false//替换classPath
}
2、在需要参数的destination中配置这个界面的参数类型和名称:
普通类型:
传递数据方:
接收数据方:
传递引用类型的数据:
先定义类:
在这里找到类名,在设置名称
传递数据方:
9、加入动画
可以在切换时的选择navOptions里加入动画
binding.textView2.setOnClickListener {
findNavController().navigate(R.id.action_welcomeFragment_to_homeFragment,null, navOptions {
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
})
}
}
也可以在导航图这里设置