android Jetpack组件Navigation导航组件--组件间跳转、组件间传值功能实现

简介: android Jetpack组件Navigation导航组件--组件间跳转、组件间传值功能实现

1 github 代码地址


边看代码边读文章效果更佳呦

github.com/ymeddmn/Jet…


2 Navigation 简单使用


Navigation 是 google Jetpack 组件库的应用导航解决方案,用于 Activity、Fragment 之间进行页面跳转。Navigation 会提供一个 xml 负责管理各个导航组件直接的关系


2.1 使用入门

2.1.1 简单实现两个 fragment 的跳转

代码所在分支:simple-use

1、添加依赖
dependencies {
  def nav_version = "2.3.5"
  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"
  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"
  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:1.0.0-alpha10"
}
复制代码


2、创建导航关系图

在 xml 文件夹下面创建一个 navigation1.xml 文件,用来存放两个 fragment 之间的路由关系,代码如下:

<?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/jjj" <!---->
    app:startDestination="@id/originFragment">
    <fragment
        android:id="@+id/originFragment"
        android:name="com.mage.navigationdemo.OriginFragment"
        android:label="fragment_origin"
        tools:layout="@layout/fragment_origin" >
        <action
            android:id="@+id/action_originFragment_to_destiationFragment"
            app:destination="@id/destiationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destiationFragment"
        android:name="com.mage.navigationdemo.DestiationFragment"
        android:label="fragment_destiation"
        tools:layout="@layout/fragment_destiation" />
</navigation>
复制代码


下面表格是各个重要标签属性的说明

属性标签名 作用
navigation 导航组件的根标签
startDestination 第一次进入页面展示的组件标签
fragment-id 视图中 fragment 的 id,导航用
fragment-name Fragment 或 Activity 的全类名
action-destination 目的地的视图 id

3、Activity 布局文件配置

在 activity 的布局文件中加入导航组件容器

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />
复制代码


属性标签名 作用
FragmentContainerView-name 固定写法
FragmentContainerView-navGraph 所关联的 xml 视图
FragmentContainerView-navGraph 确保可以拦截系统的返回键,如果设置 false 就无法进行回退操作

4、创建两个 Fragment

创建 OriginFragment.kt DestiationFragment.kt 两个 Fragment,这两个 fragment 就是常规的 fragment 创建 在第二条的 navigation 中我们将 OriginFragment 设置为了主 Fragment,既 activity 打开后首次展示的 Fragment


5、实现 OriginFragment 跳转到 DestiationFrament

OriginFragment 中添加按钮点击事件,navigate 可以实现跳转的 DestiationFragment 的效果

btn.setOnClickListener {
            val findNavController = findNavController()
            findNavController.navigate(R.id.destiationFragment)
        }
复制代码

R.id.destiationFragment 即是第 2 步中我们在 navigation 中给 DestiationFrgment 设置的 id


6、最终实现效果展示

image.png


2.1.2 实现 activity 跳转到 activity 操作

代码实现在分支:activity2activity


2.1.1 中实现的是 Fragment 和 Fragment 直接的路由,本例中我们要实现从一个 Activity 跳转到另一个 Activity 的操作

1、基本配置

本例中实现 MainActivity 跳转到 DesActivity 的操作,MainActivity 中依然要添加一个 FragmentContainerView 控件以及一个 OriginFragment。


2、导航图代码

本例导航图中需要配置 MainActivity 和 DesActivity,DesActivity 就是我们要跳转到的 Activity

<?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/navigation1"
    app:startDestination="@id/originFragment">
    <activity
        android:id="@+id/mainActivity"
        android:name="com.mage.navigationdemo.MainActivity"
        android:label="activity_main"
        tools:layout="@layout/activity_main" />
    <activity
        android:id="@+id/desActivity"
        android:name="com.mage.navigationdemo.DesActivity"
        android:label="activity_des"
        tools:layout="@layout/activity_des" />
    <fragment
        android:id="@+id/originFragment"
        android:name="com.mage.navigationdemo.OriginFragment"
        android:label="fragment_origin"
        tools:layout="@layout/fragment_origin" />
</navigation>
复制代码


3、MainActivity 中点击跳转的代码

MainActivity 中添加按钮点击进行跳转操作: R.id.nav_host_fragment 就是 MainActivity 布局文件中 FragmentContainerView 的 id,我们通过 id 拿到 NavController,通过 Controller 实现跳转到 DesActivity 的操作

findViewById<Button>(R.id.btn_des).setOnClickListener {
            findNavController(R.id.nav_host_fragment).navigate(R.id.desActivity)
        }
复制代码


4、实现效果

image.png


3 导航间数据传递


导航间数据传递有两种方式 Bundle 和 Safe Args 两种方式,其中 Safe Args 需要基于 gradle 插件,下面分别介绍一下两种方式:


3.1 Bundle 方式传递数据

这个很简单直接上代码

btn.setOnClickListener {
            val findNavController = findNavController()
            findNavController.navigate(R.id.destiationFragment, bundleOf("param1" to "我是AFragment传过来的参数"))
        }
复制代码


3.2 Safe Args 方式传递数据

这种方式需要基础插件

该插件可以生成简单的 object 和 builder 类,以便以类型安全的方式浏览和访问任何关联的参数


3.2.1 插件集成方法

1 添加跟 gradle 依赖
def nav_version = "2.3.5"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
复制代码


2 app.gradle中加入插件
plugins {
    id 'androidx.navigation.safeargs'
}
复制代码


3.2.2 插件说明(参考官方)

启用 Safe Args 后,生成的代码会为每个操作包含以下类型安全的类和方法,以及每个发送和接收目的地。

  • 为生成操作的每一个目的地创建一个类。该类的名称是在源目的地的名称后面加上“Directions”。例如,如果源目的地是名为 SpecifyAmountFragment 的 Fragment,则生成的类的名称为 SpecifyAmountFragmentDirections。 该类会为源目的地中定义的每个操作提供一个方法。
  • 对于用于传递参数的每个操作,都会创建一个 inner 类,该类的名称根据操作的名称确定。例如,如果操作名称为 confirmationAction,,则类名称为 ConfirmationAction。如果您的操作包含不带 defaultValue 的参数,则您可以使用关联的 action 类来设置参数值。
  • 为接收目的地创建一个类。该类的名称是在目的地的名称后面加上“Args”。例如,如果目的地 Fragment 的名称为 ConfirmationFragment,,则生成的类的名称为 ConfirmationFragmentArgs。可以使用该类的 fromBundle() 方法检索参数。


3.2.3 代码

代码所在分支:deliverparams

1、导航图代码

CFragment 的标签体中的标签就是 CFragment 要接收的数据

<?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/jjj"
    app:startDestination="@id/AFragment">
    <fragment
        android:id="@+id/AFragment"
        android:name="com.mage.navigationdemo.AFragment"
        android:label="fragment_origin"
        tools:layout="@layout/fragment_origin" >
        <action
            android:id="@+id/action_AFragment_to_destiationFragment"
            app:destination="@id/destiationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destiationFragment"
        android:name="com.mage.navigationdemo.BFragment"
        android:label="fragment_destiation"
        tools:layout="@layout/fragment_destiation" />
    <fragment
        android:id="@+id/CFragment"
        android:name="com.mage.navigationdemo.CFragment"
        android:label="fragment_c"
        tools:layout="@layout/fragment_c" >
        <argument
            android:name="data"
            app:argType="string"
            android:defaultValue="1" />
    </fragment>
</navigation>
复制代码


2、源 Fragment 跳转代码

插件会自动生成 CFragmentArgs 参数类

btnTC.setOnClickListener {
            AFragmentDirections.actionAFragmentToDestiationFragment()
            val args = CFragmentArgs.Builder().setData("AFragment传输到CFragment的数据").build().toBundle()
            val findNavController = findNavController()
            findNavController.navigate(R.id.CFragment,args)
        }
复制代码


3、目的地 Fragment 解析参数代码
var cFragmentArgs: CFragmentArgs? = null
    override fun onAttach(context: Context) {
        super.onAttach(context)
        arguments?.let{
            cFragmentArgs = CFragmentArgs.fromBundle(it)
        }
    }
复制代码


4、实现效果

image.png



相关文章
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
513 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
755 3
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
522 4
Android开发表情emoji功能开发
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
659 6
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
279 0
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
1112 18
|
安全 Java Android开发
探索安卓应用开发的新趋势:Kotlin和Jetpack Compose
在安卓应用开发领域,随着技术的不断进步,新的编程语言和框架层出不穷。Kotlin作为一种现代的编程语言,因其简洁性和高效性正逐渐取代Java成为安卓开发的首选语言。同时,Jetpack Compose作为一个新的UI工具包,提供了一种声明式的UI设计方法,使得界面编写更加直观和灵活。本文将深入探讨Kotlin和Jetpack Compose的特点、优势以及如何结合使用它们来构建现代化的安卓应用。
661 11
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
2131 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件

热门文章

最新文章