【Android 组件】使用传统 XML 方式实现 Navigation 导航功能

一、概述

导航是指允许用户跨越、进入和退出应用中不同内容片段的交互。Android Jetpack 的 Navigation 组件是官方推荐的页面导航和转场解决方案,能帮你轻松处理 Fragment 之间的切换、返回栈管理,支持底部导航栏和动画。

1、主要概念

  • NavHostFragment(导航宿主):包含当前导航目的地的界面元素。
  • NavGraph(导航图):一种数据结构,用于定义应用中的所有导航目的地以及这些目的地之间的连接。
  • NavController(导航控制器):用于管理目的地之间导航的中央协调器。该控制器提供了一些方法,可在目的地之间导航、处理深层链接、管理返回堆栈等。
  • NavDestination(导航目的地):导航图中的节点。当用户导航到此节点时,主机会显示其内容。
  • 路线:唯一标识目的地及其所需的任何数据。可以使用路线导航到目的地。
  • 返回堆栈:导航控制器 NavController 内用于保存用户近期所到目的地的堆栈。

2、主要功能

  • 动画和过渡:为动画和过渡提供标准化资源。
  • 深层链接:实现并处理可将用户直接转到目的地的深层链接。
  • 界面模式:只需极少的额外工作即可支持抽屉式导航栏和底部导航等模式。
  • 类型安全:支持在目的地之间传递类型安全的数据。
  • ViewModel 支持:允许将 ViewModel 的作用域限定为导航图,以便在导航图的目的地之间共享与界面相关的数据。
  • fragment 事务:全面支持和处理 fragment 事务。
  • 返回和向上:默认情况下,系统会正确处理返回和向上操作。

3、目的地类型

  • 有三种常规类型的目的地:托管、对话框和 activity
类型 说明 用例
托管 填充整个导航宿主。托管目的地的大小与导航宿主的大小相同,之前的目的地不会显示。 主界面和详情界面。
最常用和最基本的目的地
对话框 显示叠加界面组件。此界面与导航宿主的位置或大小无关。之前的目的地会显示在该目的地下方。 提醒、选择、表单。
activity 表示应用中的独特界面或功能。 充当导航图的退出点,启动与 Navigation 组件分开管理的新 Android activity。
在现代安卓开发 中,应用由 1 个 activity 组成。因此,当与第三方 activity 互动或作为迁移过程的一部分时,最适合使用 activity 目的地。

二、基础开发流程(底部导航栏)

1、添加依赖库

  • 在项目模块的 build.gradle.ks 文件中添加依赖库:
dependencies {
   
   
    ...
    implementation("androidx.activity:activity-ktx:1.10.1")
    implementation("androidx.fragment:fragment-ktx:1.5.6")
  
    // navigation
    val navVersion = "2.9.6"
    implementation("androidx.navigation:navigation-fragment:$navVersion")
    implementation("androidx.navigation:navigation-ui:$navVersion")
}

2、创建导航图(NavGraph)

  • 在 app/res/ 目录下,右键–> New --> Android Resource Directory 打开新建资源目录窗口,选择资源类型 navigation 创建导航目录:
    在这里插入图片描述
  • 在 navigation 资源目录下新建导航图文件 nav_graph.xml,在导航图文件中定义不同的目的地 fragment:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <!--    首页-->
    <fragment android:id="@+id/homeFragment"
        android:name="com.android.navigationdemo.fragment.HomeFragment"
        tools:layout="@layout/fragment_home"
        android:label="@string/nav_home"/>

    <!--    项目管理-->
    <fragment android:id="@+id/projectFragment"
        android:name="com.android.navigationdemo.fragment.ProjectFragment"
        tools:layout="@layout/fragment_project"
        android:label="@string/nav_project"/>

    <!--    用户管理-->
    <fragment android:id="@+id/userFragment"
        android:name="com.android.navigationdemo.fragment.UserFragment"
        tools:layout="@layout/fragment_user"
        android:label="@string/nav_user"/>

</navigation>

3、创建菜单资源文件

  • 在 app/res/ 目录下创建菜单资源目录(右键 -> New -> Android Resource Directory,选择 menu 类型),在 /res/menu/ 资源目录下创建导航菜单资源文件 nav_menu.xml,用来定义底部导航的菜单项内容。
  • 特别注意:菜单中的 id 内容必须跟导航图中定义的 fragment 的 id 完全一致,否则点击菜单项时不会进行 fragment 切换。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!--    首页, id对应导航图中的fragment的id-->
    <item android:id="@+id/homeFragment"
        android:title="@string/nav_home"
        android:icon="@mipmap/nav_home"/>

    <!--    工程管理-->
    <item android:id="@+id/projectFragment"
        android:title="@string/nav_project"
        android:icon="@mipmap/nav_project"/>

    <!--    用户管理-->
    <item android:id="@+id/userFragment"
        android:title="@string/nav_user"
        android:icon="@mipmap/nav_user"/>
</menu>

4、Activity布局添加导航宿主和底部导航栏

  • 在 Activity 的 XML 文件中,通过导航容器 FragmentContainerView 添加导航宿主 NavHostFragment,并通过 BottomNavigationView 底部导航栏控件添加导航栏。
  • 在 FragmentContainerView 容器控件中通过设置 navGraph 属性关联 nav_graph.xml 导航图文件。
  • 在 BottomNavigationView 底部导航栏控件中通过 menu 属性关联 nav_menu.xml 导航菜单文件。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<!--    NavHostFragment 导航宿主容器-->
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/nav_graph"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginBottom="110dp"/>

<!--    底部导航栏控件-->
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值