在以前的应用中,针对多导航模块的使用,常见的有tabhost或者FragmentTabHost,但是这些在使用的过程中,非常臃肿,包括加载和管理也不如人意。在AndroidX中,官方引入Navigation模块,通过布局绑定fragment来完成
Navigation 是一个框架,用于在 Android 应用中的“目的地”之间导航,该框架提供一致的 API,无论目的地是作为 fragment、activity 还是其他组件实现。
Google开发者官方API
name="androidx.navigation.fragment.NavHostFragment",固定写法,必须指向NavHostFragment
defaultNavHost:为true,设为默认host
navGraph:子fragment的配置路径
在res目录下新建navigation文件夹
在gav_graph.xml下新增fragment节点,配置如下
如果你有几个fragment,就新增多少个
app:startDestination:默认一开始加载哪个fragment,就指向该fragment的id
fragment的顺序随意,不受限制。
public static NavController findNavController(@NonNull Activity activity, @IdRes int viewId)
这样,我们就初始化好一个控制器。
动态加载导航到指定的child fragment,该fragment必须已添加到navigation目录下xml文件中,也就是当前加载的列表
controll?.navigate(R.id.fragment_one)
注意:这个id一定是graph加载的xml文件中的,否则报错找不到
1.先读取 var gavpath=controll?.navInflater?.inflate(R.navigation.nav_graph) 2.再设置 controll?.graph=gavpath!!
备注:gavpath!!这种写法表示可为null,如果直接赋值,会提示错误。在变量后面加上 "!!"即可
controll?.addOnDestinationChangedListener {controller,destination,arguments-> toast("${destination.displayName}") }
controll?.navigateUp
其他API可以自行研究
想比较以往的tabhost加载,这种导航比较轻量化,我们可以根据业务需求,将不同的加进去,实现动态配置,也方便管理