Android Jetpack - Navigation的简单使用

Android  代码片段  2021年11月25日 pm7:28发布3年前 (2021)更新 城堡大人
70 0 0

前言

Android JetpackNavigation确实好用,这里就简单记录一下,方便自己查阅。

这个出来了很久了,但也就偶尔用用,用完就忘了,正应了微信之父张小龙的名言[用完即走]。

PS: 好记性不如烂笔头。

正文

Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。

Navigation主要由三部分组成:

  1. Navigation graph:一个包含所有导航相关信息的 XML 资源
  2. NavHostFragment:一种特殊的Fragment,用于承载导航内容的容器
  3. NavController:管理应用导航的对象,实现Fragment之间的跳转等操作

简单使用

一、添加依赖

dependencies {
  def nav_version = "2.3.1"

  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  }
二、创建导航图
  1. 在“Project”窗口中,右键点击 res 目录,然后依次选择 New > Android Resource File。此时系统会显示 New Resource File 对话框。
  2. 在 File name 字段中输入名称,例如“nav_graph”。
  3. 从 Resource type 下拉列表中选择 Navigation,然后点击 OK。
三、创建Navigation graph
1. nav_graoh.xml

新建好的nav_graph.xml切换到design模式下,在 Navigation Editor 中,点击 New Destination 图标,然后点击 Create new destination,即可快速创建新的Fragment,

这里简单的创建FragmentA、FragmentB、FragmentC三个fragment来举例。

当然,如果要配置跳转关系,可以

通过手动配置页面之间的跳转关系,点击某个页面,右边会出现一个小圆点,拖曳小圆点指向跳转的页面,这里设置跳转的关系为FragmentA -> FragmentB -> FragmentC。

这种场景不是很多,现实中都是自己做指定跳转。

PS: 我这里不介绍这个,我用代码控制跳转关系。

因此,我的nav_graph.xml代码如下:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/fragmentA">

    <fragment
        android:id="@+id/fragmentA"
        android:name="com.biumall.view.fragment.FragmentA"
        android:label="fragment_a"
        tools:layout="@layout/fragment_a" />
    <fragment
        android:id="@+id/fragmentB"
        android:name="com.biumall.view.fragment.FragmentB"
        android:label="fragment_b"
        tools:layout="@layout/fragment_b" />
    <fragment
        android:id="@+id/fragmentC"
        android:name="com.biumall.view.fragment.FragmentC"
        android:label="fragment_c"
        tools:layout="@layout/fragment_c" />
</navigation>

代码简介:

  1. navigation是根标签。通过[app:startDestination="@id/fragmentA"]配置默认启动的第一个页面,这里配置的是FragmentA,改这个可以设置默认的Fragment。
  2. fragment标签代表一个fragment。有Fragment对应的配置信息。
2. activity_main.xml的代码配置

下面是activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">


    <LinearLayout
        android:id="@+id/main_left_layout"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <Button
            android:id="@+id/main_left_bt_a"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" A"
            android:textSize="30sp" />

        <Button
            android:id="@+id/main_left_bt_b"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" B"
            android:textSize="30sp" />

        <Button
            android:id="@+id/main_left_bt_c"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=" C"
            android:textSize="30sp" />

    </LinearLayout>

    <fragment
        android:id="@+id/right_nav_host"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toEndOf="@+id/main_left_layout"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"
        tools:context=".MainActivity" />
</RelativeLayout>

PS: 我这里是要通Button进行切换Fragment的。

  1. android:name指定NavHostFragment
  2. app:navGraph指定导航视图,即建好的nav_graph.xml
  3. app:defaultNavHost=true 意思是可以拦截系统的返回键,可以理解为默认给fragment实现了返回键的功能,这样在fragment的跳转过程中,当我们按返回键时,就可以使得fragment跟activity一样可以回到上一个页面了。

PS:不使用Navigation,我们之前的Fragment没法直接获取到Back等事件的。

四、NavController的使用

我这里直接上代码

1. Activity中控制Fragment
    private NavController mNavController = null;

    mNavController = Navigation.findNavController(MainActivity.this, R.id.right_nav_host);

    //这里切换FragmentA,如果要切换其他的,自行替换
    mNavController.navigate(R.id.fragmentA);
2. Fragment中切换Fragment

这里有三种,分别如下:

方式一

        fragmentABinding.aTvStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: ");
                //方式一
                NavHostFragment.findNavController(FragmentA.this).navigate(R.id.fragmentB);
            }
        });

方式二

        fragmentBBinding.bTvStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //方式二
                Navigation.findNavController(getView()).navigate(R.id.fragmentC);
            }
        });

方式三

        fragmentCBinding.cTvStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick : ");
                //方三
                Navigation.findNavController(getActivity(), R.id.right_nav_host).navigate(R.id.fragmentA);

            }
        });

PS: 上使用了Binding,各个Fragment的布局就不更新,就一个TextView。

参考文章

PS:参考文3有动图,写得很详细,大佬用心了。推荐先看这个,本文大部分内用都引用这篇文章,。

  1. Android Jetpack - 使用 Navigation 管理页面跳转
  2. Android架构组件-Navigation的使用(一)
  3. Android Navigation 组件(基础篇)
  4. Android开发 navigation入门详解

 历史上的今天

  1. 2019: 贾平凹:每个生命都有自己的光芒(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

记录工作和生活的点点滴滴

1、好记性不如烂笔头;2、觉得已经晚了,恰恰是最早的时候;3、鸡蛋从外打破是食物,从内打破是生命我们新版上线啦(掌声),这次改版很大,放弃之前传统的导航模式,首先采用“网址导航+读书(阅读)+博客”全新的模式,依旧是国内第一个以读书(阅读)为主题的网址导航大全!因为热爱,所以折腾!PS :...

梁实秋:排队

如果起个大早,赶到邮局烧头炷香,你也休想能从容办事,因为柜台里的先生小姐正忙着开柜子、取文件、调整邮戳,这时候就有其他顾客陆续进来,说不定一位站在你左边,一位站在你右边,也许是衣冠楚楚的,也许是破衣邋遢的,总之会把你夹在中间。夹在中间的人未必有优先权,所以,三个人就挤得很紧,胳膊粗、个子大、脚跟稳...

白岩松:幸福在哪里

一走在人群中,我习惯看一看周围人的手腕,那里似乎藏着一个属于当代中国人的内心秘密,从不言说,却日益增多。越来越多的人,不分男女,会戴上一个手串,这其中,不乏有人仅仅是为了装饰;更多的却带有祈福与安心的意味,这手串停留在装饰与信仰之间,或左或右。这其中,是怎样的一种相信或怎样的一种抚慰?又或者,来...

Android NDK 部分版本下载

本文摘抄《NDK各版本下载》以便自己下载https://dl.google.com/android/repository/android-ndk-r17b-windows-x86.ziphttps://dl.google.com/android/repository/android-nd...

Android磁盘之U盘卸载

前言之前介绍了U盘的挂载,那当然不能少了U盘的卸载。这里大概的记录一下,方便自己查阅。Android P这里很多都是网上的,我就走走流程。正文VolumeManager.cpphandleBlockEvent()void VolumeManager::handleBlockEve...

Linux修改文件属性

前言经常用,但还是会忘记,因此这里又整理一下。记录全一定,方便自己回顾。这里主要介绍chown ,chmod,chgrp。正文在Linux中通过ls -l可以看文件的属性。chgrpchgrp:更改文件属组。chgrp [-R] 属组名 文件名-R:递归更改文件属组,就是在更...