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



相关文章
|
9月前
|
存储 安全 Android开发
构建高效的Android应用:Kotlin与Jetpack的结合
【5月更文挑战第31天】 在移动开发的世界中,Android 平台因其开放性和广泛的用户基础而备受开发者青睐。随着技术的进步和用户需求的不断升级,开发一个高效、流畅且易于维护的 Android 应用变得愈发重要。本文将探讨如何通过结合现代编程语言 Kotlin 和 Android Jetpack 组件来提升 Android 应用的性能和可维护性。我们将深入分析 Kotlin 语言的优势,探索 Jetpack 组件的核心功能,并通过实例演示如何在实际项目中应用这些技术。
|
8月前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。
|
4月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
80 6
|
7月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
143 4
|
7月前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
180 15
|
8月前
|
JavaScript Java Android开发
kotlin安卓在Jetpack Compose 框架下跨组件通讯EventBus
**EventBus** 是一个Android事件总线库,简化组件间通信。要使用它,首先在Gradle中添加依赖`implementation &#39;org.greenrobot:eventbus:3.3.1&#39;`。然后,可选地定义事件类如`MessageEvent`。在活动或Fragment的`onCreate`中注册订阅者,在`onDestroy`中反注册。通过`@Subscribe`注解方法处理事件,如`onMessageEvent`。发送事件使用`EventBus.getDefault().post()`。
|
9月前
|
Java 数据库 Android开发
构建高效Android应用:Kotlin与Jetpack的完美结合
【5月更文挑战第28天】 在现代移动开发领域,Android平台以其广泛的用户基础和开放性受到开发者青睐。随着技术的不断进步,Kotlin语言以其简洁性和功能性成为Android开发的首选。而Android Jetpack组件则为开发者提供了一套高质量的设计架构、工具和UI组件,以简化应用程序的开发过程。本文将探讨如何利用Kotlin语言和Android Jetpack组件共同构建一个高效的Android应用程序,涵盖从语言特性到架构模式的全面分析,并提供具体的实践指导。
|
8月前
|
Android开发
Jetpack Compose: Hello Android
Jetpack Compose: Hello Android
|
9月前
|
安全 数据库 Android开发
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【5月更文挑战第22天】 在移动开发领域,Android系统因其开放性和广泛的用户基础而备受开发者青睐。随着技术的不断演进,Kotlin语言以其简洁性和功能性成为Android开发的首选语言。本文将深入探讨如何结合Kotlin和Android Jetpack组件来构建一个高效且易于维护的Android应用。我们将重点讨论如何使用Jetpack的核心组件,如LiveData、ViewModel和Room,以及Kotlin的语言特性来优化代码结构,提高应用性能,并简化数据管理。通过具体案例分析,本文旨在为开发者提供一套实用的技术指导,帮助他们在竞争激烈的市场中脱颖而出。
|
9月前
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)

热门文章

最新文章

  • 1
    NeurIPS 2024:收敛速度最高8倍,准确率提升超30%!华科发布MoE Jetpack框架
  • 2
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 5
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡