Android JetPack 之 Navigation

Navigation 可以更加方便的使用 Fragment,使用过程非常简单,下面看一下使用方法

1,导入依赖

  	implementation 'android.arch.navigation:navigation-fragment:1.0.0'
    implementation 'android.arch.navigation:navigation-ui:1.0.0'
    androidTestImplementation 'android.arch.navigation:navigation-testing:1.0.0-alpha08'

2,在Res 目录下 创建 navigation 文件夹,然后创建 nav_graph.xml

在这里插入图片描述

3,在这个xml 文件中 选择自己的 fragment

在这里插入图片描述

​ 需要指定从那个 fragment 开始的话就直接 选中某个视图 然后右击 点击 Set as Start Destination 这个项目就可以将这个设置为 最开始的fragment,然后通过连线的方式确定他启动的是哪一个fragment

4,在 Activity 中引用

​ 有两种方式进行引用,修改 Activity 的布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".mvp.base.BaseActivity">


    <!-- name 是NavHostFragment,他实现了NavHost,这是一个用于放置管理的 destination 的空视图 -->
    <!-- defaultNavHost 表示NavHostFragment 可以拦截处理返回键  -->
    <!-- navGraph 用于将这个 NavHostFragment 和 nav_graph.xml 关联起来 -->
    <fragment
        android:id="@+id/nav_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"/>

</androidx.appcompat.widget.LinearLayoutCompat>

​ 通过上面这种方式就可以 显示第一个fragment 了。

​ 还有一种方式,如下:

<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".mvp.base.BaseActivity">

    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
</androidx.appcompat.widget.LinearLayoutCompat>

​ 还需要在代码中进行如下修改:

//找到xml 文件
        NavHostFragment navHost = NavHostFragment.create(R.navigation.nav_graph);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.frame_layout,navHost)
                // 相等于 xml 中的 app:defaultNavHost="true"
                .setPrimaryNavigationFragment(navHost)
                .commit();

​ 即可完成加载

5,碎片之间的跳转 和 回退栈

​ 在 nav_graph.xml 中将 fragment 连接好以后 就可以使用 Navigation 自带的方法进行跳转了,并且在跳转的使用可以在nav_graph.xml 中设置跳转的动画。fragment 直接跳转的方法 如下 :

// id 为nav_graph.xml 中 fragment 内 action 的id ,就是需要跳转掉指定fragment的 id

fragment基本跳转	A->B
Navigation.findNavController(rootView).navigate(id);

fragment 携带数据跳转-Bundle   A->B
Navigation.findNavController(rootView).navigate(id, bundle);

跳转方法,多级跳转     A->B->C,C->A,避免Navigation 跳转后重新执行生命周期方法
注意:这里的id 为 需要回退到指定fragment的 id,并非action,不需要再 xml 中进行连线。
第二个参数 为false 表示 退栈不包括指定的id,否则会将 id 的那个fragment 也退掉
avigation.findNavController(rootView).popBackStack(id, false); //如果退栈一次就返回 true

退栈方法
Navigation.findNavController(rootView).navigateUp();

6,生命周期

​ 通过 Navigation 进行跳转后,原来 fragment 的生命周期会走到那一步呢?如下:

​ A —> B

​ 从 A 到 B ,则A的生命周期执行到 onDestroyView() ,这个方法的作用就是销毁 fragment 的有关视图 但是依然可以通过 onCreateView() 方法进行重写创建视图。

​ 在跳到 B 后,如果点击了 返回,则 A 就会通过 onCreateView() 重新创建视图。这时 B 就会 执行 onDestory()。

有关视图 但是依然可以通过 onCreateView() 方法进行重写创建视图。

​ 在跳到 B 后,如果点击了 返回,则 A 就会通过 onCreateView() 重新创建视图。这时 B 就会 执行 onDestory()。

以上就是 Navigation 的用法,是不是非常简单呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tʀᴜsᴛ³⁴⁵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值