【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

这篇具有很好参考价值的文章主要介绍了【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





一、Navigation 引入



Android 开发中 , 最常用的 UI 架构 就是 使用一个 Activity 嵌套多个 Fragment , 这就需要 对 Fragment 进行管理 ;

在传统的 Android 开发中 , 使用 FragmentManager 和 FragmentTransaction 管理

  • Fragment 的生命周期 ,
  • Fragment 页面切换 ,
  • Fragment 切换动画设置运行 ,
  • Fragment 与 Fragment / Activity 之间的数据传递 ,
  • 应用 App Bar 管理

等操作 ;

上述操作都是 使用纯代码方式进行实现 , 在页面和 App Bar 管理过程中使用比较繁琐 , 维护难度较大 ;


Jetpack 提供的 Navigation 组件 , 解决上述 Fragment 页面管理 与 App Bar 管理 问题 ;

Navigation 主要功能就是帮助 Activity 管理 Fragment ;


App Bar 是应用程序顶部的一个可用于导航和操作应用程序的界面元素。App Bar 管理指的是使用 Android 框架提供的 API,对 App Bar 进行创建、设置和管理的过程。

常见的App Bar 管理操作:

  • 创建 App Bar:使用 Android 框架提供的 Toolbar 控件创建 App Bar。
  • 设置 App Bar 标题:使用 setTitle() 方法设置 App Bar 的标题。
  • 设置 App Bar Logo:使用 setLogo() 方法设置 App Bar 的 Logo。
  • 添加菜单项:使用 onCreateOptionsMenu() 方法创建 App Bar 中的菜单项。
  • 处理菜单项点击事件:使用 onOptionsItemSelected() 方法处理 App Bar 中的菜单项点击事件。
  • 关联 App Bar 和布局:使用 setSupportActionBar() 方法将 App Bar 与布局关联起来。
  • 启用/禁用 App Bar:使用 setEnabled() 方法启用或禁用 App Bar。




二、Navigation 特点



Navigation 提供了 可视化的 页面导航图 , 与 iOS 开发中的 Xcode 环境中的 StoryBoard 类似 ; 在 布局文件 的 Design 模式下 , 可以看到 Fragment 之间的跳转关系 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

在 Xml 布局文件中 , 通过在 Fragment 标签中 , 添加 action 标签 , 设置该标签 app:destination 属性 , 完成 Fragment 之间的导航 ;

如果要 为 Fragment 跳转设置动画 , 可以直接在 Navigation 图形化界面中选中某个跳转 , 然后直接在 布局文件的 Design 图形化界面中 , 设置跳转的动画 ;

通过 safe args 可以实现 Fragment 页面之间的参数安全传递 , 传统方式是使用 Intent 进行数据传递 ;

通过该 Design 模式下的 Navigation 管理 , 可以对 菜单 , 底部导航栏 , 抽屉菜单 的页面及跳转逻辑 , 进行统一管理 ;

支持 DeepLink 深层链接 , 可以直接跳转到指定的 Fragment 中 ;





三、Navigation 重要组件



Navigation 重要组件 :

  • Navigation Graph 组件 : 是 Navigation 组件中的 Xml 文件 , 这是新加入的 Xml 文件类型 , 该文件定义在 res 资源目录下的 navigation 目录下 , 该文件中包含了 应用程序 中的所有界面 , 以及界面之间的跳转关系 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

  • NavHostFragment 组件 : 该组件是 Navigation 组件的核心组成部分 , 它可以看做为一个空的 Fragment 容器 , 用于在应用中显示目的地 , NavHostFragment 会自动处理目的地之间的转换和回退操作 ; Navigation Graph 中定义的 Fragment 页面 需要通过 NavHostFragment 进行展示 ;
  • NavController 组件 : 该组件是 NavHostFragment 中的管理对象 , 用于管理应用中的导航操作 , 主要是完成在 Navigation Graph 中定义的页面切换操作 ; 通过 NavController 可以轻松地跳转到不同的目的地 , 并处理回退操作 ;

切换 Fragment 显示流程 :

  • 使用 NavController 组件 切换 Fragment , 设置 要跳转的 定义在 Navigation Graph 中定义的 Fragment ;
  • NavController 组件 会将 指定的 Fragment 显示到 NavHostFragment 组件中 ;




四、Navigation 使用流程



Navigation 使用流程 :

  • 创建若干 Fragment 页面
  • 创建 Navigation Graph , 并指定要跳转的 destination 页面
  • 创建 NavHostFragment 组件
  • 执行 Fragment 页面跳转 , 并添加动画效果
  • 使用 NavController 组件实现页面导航
  • 使用 Safe Args 插件安全传递数据

创建 Navigation Graph 组件有一个前提 , 那就是 Fragment 已经创建完毕 ;

创建 NavHostFragment 组件有一个前提 , 那就是 Navigation Graph 已经创建完毕 ;


1、创建 Fragment


右键点击 代码 包名 , 在弹出的右侧菜单中 , 选择 " New / Fragment / Fragment (Blank) " 选项 ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

输入 Fragment 名称 " FragmentA " , 然后点击 " Finish " 按钮 , 创建完毕 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )
创建后的 Fragment 会自动生成一系列代码 :

package kim.hsl.nav

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [FragmentA.newInstance] factory method to
 * create an instance of this fragment.
 */
class FragmentA : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_a, container, false)
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment FragmentA.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            FragmentA().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}

同时还会在 " res/layout " 目录中 , 自动生成 FragmentA 对应的布局文件 " fragment_a.xml " ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )
自动生成的布局文件代码如下 :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentA">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

2、创建 Navigation Graph 组件


创建 Navigation Graph 组件有一个前提 , 那就是 Fragment 已经创建完毕 ;


右键点击 res 资源目录 , 选择 " New / Android Resource File " 选项 ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

在弹出的对话框中 , 选择 Resource Type 为 Navigation , 其 Directory name 会被自动设置为 navigation , 需要自定义设置的是 File name , 输入文件名称即可 , 这里命名为 navigation_graph.xml ;
【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

生成的 " res/navigation/navigation_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"
    android:id="@+id/navigation_graph">

</navigation>

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )


3、处理 Navigation Graph 组件报错信息 " failed to add navigation dependency "


创建完成后 , 出现如下报错信息 " failed to add navigation dependency " ;
【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

点击该界面 , 会弹出如下对话框 , 点击 OK , 会自动向 build.gradle 构建脚本中添加依赖 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

被添加的依赖如下 :

    implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
    implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'

添加完依赖后 , 重新 Build 一下应用 , Navigation 功能正常使用 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )


4、编辑 Navigation Graph 组件 - 创建 action 跳转


点击 Navigation Graph 中 Design 模式下 的 " New Destination " 按钮 ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

在弹出的下拉菜单中 , 可以选择之前创建的两个 Fragment , 分别是 FragmentA 和 FragmentB , 对应的 xml 布局文件是 fragment_a.xml 和 fragment_b.xml ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

在上述下拉菜单中 , 点击 fragment_a , 即可将该 FragmentA 设置到面板中 , 点击 fragment_b 即可将 FragmentB 设置到面板中 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

设置完毕后 , 将 鼠标移动到 fragmentA 上 , 可以看到右侧的 圆圈 ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

在 圆圈 上 , 按住鼠标左键 , 拖动到 fragmentB 上 , 会自动生成一个箭头 , 这个箭头就是 action , 代表了一次跳转 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

也可以设置一个从 fragmentB 到 fragmentA 的 action 箭头 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )


5、创建 NavHostFragment 组件


创建 Navigation Graph 组件有一个前提 , 那就是 Fragment 已经创建完毕 ;

创建 NavHostFragment 组件有一个前提 , 那就是 Navigation Graph 已经创建完毕 ;


NavHostFragment 组件 需要设置在 Activity 中 , 具体是在 Activity 的布局文件中设置 NavHostFragment 容器组件 , 这是一个 UI 布局组件 ;

拖动 Container 下的 NavHostFragment 组件 到 Activity 布局中 ,

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

拖动后 , 需要选择对应的 Navigation Graph , 因此创建 NavHostFragment 组件有一个前提 , 那就是 Navigation Graph 已经创建完毕 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

然后设置该 NavHostFragment 组件 的约束布局选项 , 充满全屏 ;

【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

生成的完整 Activity 布局文件代码如下 :

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation_graph" />

</androidx.constraintlayout.widget.ConstraintLayout>

核心的 NavHostFragment 组件如下 :

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation_graph" />

6、在 Activity 中获取 NavController


通过 调用 findNavController 函数 , 获取 NavController , 然后通过该 NavController 变量进行导航 ;文章来源地址https://www.toymoban.com/news/detail-489670.html

        // fragmentContainerView 组件的 管理 操作通过 NavController 完成
        // 对应的就是 navController 实例变量
        val navController = findNavController(this, R.id.fragment)
        NavigationUI.setupActionBarWithNavController(this, navController)

到了这里,关于【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android笔记(十):结合Navigation组件实现Compose界面的导航

    在Android笔记(七)搭建Android JetPack Compose组件中Scaffold脚手架 一文中通过定义一个导航的函数来实现不同界面的切换。如果没有传递任何参数,这样的导航处理也是可以接受的,处理方式也非常简单。但是,如果考虑到不同Compose界面的切换且传递参数,或者有更复杂地处理情

    2024年01月22日
    浏览(49)
  • React Navigation 使用导航

    在 Web 浏览器中,您可以使用锚标记链接到不同的页面。当用户单击链接时,URL 会被推送到浏览器 历史记录堆栈 中。当用户按下后退按钮时,浏览器会从历史堆栈顶部弹出该项目,因此活动页面现在是以前访问过的页面。React Native 不像 Web 浏览器那样具有全局历史堆栈的内

    2024年02月11日
    浏览(52)
  • Android Jetpack学习系列——Navigation

    写在前面 Google在2018年就推出了Jetpack组件库,但是直到今天我才给重视起来,这真的不得不说是一件让人遗憾的事。过去几年的空闲时间里,我一直在尝试做一套自己的组件库,帮助自己快速开发,虽然也听说过Jetpack,但是压根儿也没去了解,但是其实自己已经无形之中用到

    2024年02月02日
    浏览(39)
  • RN 使用react-navigation写可以滚动的横向导航条(expo项目)

      装包:             参考链接: https://chat.xutongbao.top/ https://www.cnblogs.com/tengyuxin/p/13263143.html https://reactnavigation.org/docs/material-top-tab-navigator/ 

    2024年02月13日
    浏览(60)
  • 【见微知著】Android Jetpack - Navigation的架构设计

    前言:人总是理所当然的忘记,是谁风里雨里,一直默默的守护在原地。 Navigation 作为 Android Jetpack 组件库中的一员,是一个通用的页面导航框架。为 单 Activity 架构而生的端内路由导航,用来管理 Fragment 的切换,并且可以通过可视化的方式,看见 App 的交互流程。今天主要来

    2024年02月08日
    浏览(53)
  • 【Unity】AI-Navigation导航系统生成导航网络

    在Unity资源包中添加 AI Navigation 插件,并 Install 。 找到 AN 标志,勾选 Show Only Selected(可有可无,只是为了更好地看出来网格在哪)。 在project面板里面创建 AI-NavMesh Surface 文件。 双击新建的文件,点击 Back 烘焙网格。 勾选 Show NavMesh 显示效果,识别为是否是障碍物的依据,就

    2024年04月27日
    浏览(39)
  • Android Navigation 导航切换fragment用法

    对于Android Navigation组件的导航到Fragment,您可以按照以下步骤操作: 首先,在您的项目的build.gradle文件中添加Navigation依赖: 在你的res目录下的navigation文件夹中创建一个nav_graph.xml文件,并定义您的导航图。 在您的布局文件中,添加NavHostFragment作为导航的目标。 在您的Activi

    2024年02月12日
    浏览(40)
  • 【ROS】ros导航navigation模块学习

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍navigation导航模块学习与算法示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 导航模块是机器人系统中的一个重要组件,用于实现机器人在

    2024年02月13日
    浏览(39)
  • Unity基础到入门-导航系统(Navigation)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Unity 3D导航系统( Navigation ) Unity 3D Navigation(导航)是用于实现动态 物体自动寻路 的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计

    2024年02月03日
    浏览(45)
  • Jetpack Compose 中组件使用教程(比较全面)

    在本文中,我们将学习 Jetpack Compose,这是一个用于构建原生 UI 的现代工具包。 通过这个完整的教程,我们将学习如何使用 Text、TextField、Preview、Column、Row、Button、Card、AlertDialog、MaterialDesign 元素等。因此,事不宜迟,让我们开始创建一个 Jetpack Compose 项目。因此,本章节是

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包