1、介绍:

        在以前的应用中,针对多导航模块的使用,常见的有tabhost或者FragmentTabHost,但是这些在使用的过程中,非常臃肿,包括加载和管理也不如人意。在AndroidX中,官方引入Navigation模块,通过布局绑定fragment来完成

       

 Navigation 是一个框架,用于在 Android 应用中的“目的地”之间导航,该框架提供一致的 API,无论目的地是作为 fragment、activity 还是其他组件实现。

Google开发者官方API

二、接入步骤

1、在布局中新增一个fragment的view

<fragment
        android:id="@+id/testfragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

name="androidx.navigation.fragment.NavHostFragment",固定写法,必须指向NavHostFragment

defaultNavHost:为true,设为默认host

navGraph:子fragment的配置路径

2、创建navigation(navGraph)

在res目录下新建navigation文件夹

Android JetPack底部导航Navigation 组件的介绍与使用_android

 在gav_graph.xml下新增fragment节点,配置如下

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/fragment_one">


    <fragment
        android:id="@+id/fragment_one"
        android:name="com.example.wiik.testdemo.fragment.OneFragment" />

    <fragment
        android:id="@+id/fragment_two"
        android:name="com.example.wiik.testdemo.fragment.TwoFragment" />

    <fragment
        android:id="@+id/fragment_three"
        android:name="com.example.wiik.testdemo.fragment.ThreeFragment" />



</navigation>

如果你有几个fragment,就新增多少个

app:startDestination:默认一开始加载哪个fragment,就指向该fragment的id

fragment的顺序随意,不受限制。

3、如何在Activity或者Fragment中引用

我们是通过NavController 来管理


public static NavController findNavController(@NonNull Activity activity, @IdRes int viewId)


1,、activity: 当前的宿主

2、viewId:就是fragment的id,testfragment,将layout的fragment加载进来

3、var controll = Navigation.findNavController(this, R.id.testfragment) as                                 NavController;

这样,我们就初始化好一个控制器。

动态加载导航到指定的child fragment,该fragment必须已添加到navigation目录下xml文件中,也就是当前加载的列表

切换fragment:


controll?.navigate(R.id.fragment_one)


注意:这个id一定是graph加载的xml文件中的,否则报错找不到

动态切换navigation 目录下xml的配置文件


1.先读取 var gavpath=controll?.navInflater?.inflate(R.navigation.nav_graph) 2.再设置 controll?.graph=gavpath!!


Android JetPack底部导航Navigation 组件的介绍与使用_xml_02

备注:gavpath!!这种写法表示可为null,如果直接赋值,会提示错误。在变量后面加上 "!!"即可

添加item的切换监听:addOnDestinationChangedListener


controll?.addOnDestinationChangedListener {controller,destination,arguments-> toast("${destination.displayName}") }


返回上一个fragment:


controll?.navigateUp


其他API可以自行研究

三、总结

想比较以往的tabhost加载,这种导航比较轻量化,我们可以根据业务需求,将不同的加进去,实现动态配置,也方便管理