📜  Android 架构组件中的导航概述(1)

📅  最后修改于: 2023-12-03 14:59:16.580000             🧑  作者: Mango

Android 架构组件中的导航概述

Android 架构组件中的导航(Navigation)是一种用于管理应用程序组件之间导航关系的框架。它包含许多有用的工具,可实现更简单的应用程序导航和开发。本篇文章将为程序员进行介绍。

导航图

导航图是定义应用程序中所有目标目的地和路径之间关系的 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">
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.navigationdemo.HomeFragment"
        android:label="@string/home_fragment_label"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>
    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.navigationdemo.DetailFragment"
        android:label="@string/detail_fragment_label"
        tools:layout="@layout/fragment_detail" />
</navigation>

上述代码中,首先定义了一个 Navigation 根元素,其中包含两个 Fragment(homeFragment 和 detailFragment),以及一个 action 元素,用于表示从 homeFragment 到 detailFragment 的导航路径。

NavController

NavController 是处理与导航图关联的类。在拥有导航图后,可使用 NavController 中的一些 API 完成以下操作:

  • 导航到目标指定的屏幕;
  • 向路径传递参数;
  • 获取当前目标的详细信息;
  • 监听目标更改。

以下代码演示了如何使用 NavController 导航到目标屏幕:

val navController = findNavController(R.id.nav_host_fragment)
navController.navigate(R.id.action_to_detail)

上述代码中,通过 findNavController 获取到 NavController 实例,然后使用 navigate 导航到 action_to_detail 所代表的目标屏幕。

应用程序根部目录

将 下载器 Fragment(DownloaderFragment)作为应用程序根部目录具有以下优点:

  • 应用程序根部目录始终是应用程序的起点;
  • 此方法可以防止用户通过系统“回退”按键打乱应用程序导航结构;
  • 可以在 DrawerLayout 和 BottomNavigationView 中使用根部目录 。

以下代码演示了如何使用应用程序根部目录:

<fragment
    android:id="@+id/downloaderFragment"
    android:name="com.example.navigationdemo.DownloaderFragment"
    android:label="@string/app_name"
    tools:layout="@layout/fragment_downloader">
    <action
        android:id="@+id/action_downloader_to_home"
        app:destination="@id/homeFragment"
        app:popUpTo="@id/downloaderFragment"
        app:popUpToInclusive="true" />
</fragment>

上述代码中,DownloaderFragment 作为应用程序的根部目录,此时在导航之前,应用程序的根部目录是 DownloaderFragment。同时,定义了一个 action 元素,用于导航到 homeFragment,并设置了 popUpTo 和 popUpToInclusive 属性,这些属性用于指定 “向上” 导航时需要从任务栈中清除哪些目标。

动画

导航框架提供了一些默认的转场动画,例如:从一个 Fragment 到另一个 Fragment;从一个 Activity 到另一个 Activity 等。若要为导航添加自定义动画,请在 res 目录中创建一个新的 anim 目录,并添加自定义的动画资源文件,然后在 Navigation Xml 文件中为路径定义动画即可。

以下代码演示了如何在导航时添加自定义动画:

<action
    android:id="@+id/action_home_to_detail"
    app:destination="@+id/detailFragment” 
    app:enterAnim="@anim/slide_in_right"
    app:exitAnim="@anim/slide_out_left"/>

上述代码中,定义一个 action 元素,该元素导航到 detailFragment 并为进入和退出自定义的动画资源文件。此时在导航时,将使用从右侧滑入的方式打开 detailFragment。

总结

本篇文章介绍了 Android 架构组件中的导航,包括导航图、NavController、应用程序根部目录、动画等。使用导航框架,可轻松实现应用程序导航和开发。