androidJetpack组件Navigation导航组件--组件间跳转、组件间
传值功能实现
欢迎关注V ”安安安安卓“ 学习更多知识
--
1 github 代码地址
边看代码边读⽂章效果更佳呦
2 Navigation 简单使⽤
Navigation 是 google Jetpack 组件库的应⽤导航解决⽅案,⽤于 Activity、Fragment 之间进⾏页⾯跳转。Navigation 会提供⼀个 xml 负责管理各个导航组件直接的关系
2.1 使⽤⼊门
2.1.1 简单实现两个 fragment 的跳转
代码所在分⽀:simple-u
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 Compo Integration
implementation "androidx.navigation:navigation-compo:1.0.0-alpha10"
}
2、创建导航关系图
在 xml ⽂件夹下⾯创建⼀个 l ⽂件,⽤来存放两个 fragment 之间的路由关系,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/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" />
pour的过去式属性标签名作⽤
FragmentContainerView-name固定写法
FragmentContainerView-navGraph所关联的 xml 视图
FragmentContainerView-navGraph确保可以拦截系统的返回键,如果设置 fal 就⽆法进⾏回退操作
4、创建两个 Fragment
创建 OriginFragment.kt DestiationFragment.kt 两个 Fragment,这两个 fragment 就是常规的 fragment 创建 在第⼆条的navigation 中我们将 OriginFragment 设置为了主 Fragment,既 activity 打开后⾸次展⽰的 Fragment
音乐三要素
5、实现 OriginFragment 跳转到 DestiationFrament
OriginFragment 中添加按钮点击事件,navigate 可以实现跳转的 DestiationFragment 的效果
btn.tOnClickListener {
val findNavController = findNavController()
findNavController.navigate(R.id.destiationFragment)
}
R.id.destiationFragment 即是第 2 步中我们在 navigation 中给 DestiationFrgment 设置的 id
6、最终实现效果展⽰
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="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/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).tOnClickListener {
findNavController(R.id.nav_host_fragment).navigate(R.id.desActivity)
}
4、实现效果
3 导航间数据传递
导航间数据传递有两种⽅式 Bundle 和 Safe Args 两种⽅式,其中 Safe Args 需要基于 gradle 插件,下⾯分别介绍⼀下两种⽅式:3.1 Bundle ⽅式传递数据
这个很简单直接上代码
btn.tOnClickListener {
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"
adle中加⼊插件
plugins {
id 'androidx.navigation.safeargs'
}
3.2.2 插件说明(参考官⽅)
启⽤ Safe Args 后,⽣成的代码会为每个操作包含以下类型安全的类和⽅法,以及每个发送和接收⽬的地。
为⽣成操作的每⼀个⽬的地创建⼀个类。该类的名称是在源⽬的地的名称后⾯加上“Directions”。例如,如果源⽬的地是名为SpecifyAmountFragment 的 Fragment,则⽣成的类的名称为 SpecifyAmou
ntFragmentDirections。 该类会为源⽬的地中定义的每个操作提供⼀个⽅法。
对于⽤于传递参数的每个操作,都会创建⼀个 inner 类,该类的名称根据操作的名称确定。例如,如果操作名称为
confirmationAction,,则类名称为 ConfirmationAction。如果您的操作包含不带 defaultValue 的参数,则您可以使⽤关联的action 类来设置参数值。
为接收⽬的地创建⼀个类。该类的名称是在⽬的地的名称后⾯加上“Args”。例如,如果⽬的地 Fragment 的名称为
ConfirmationFragment,,则⽣成的类的名称为 ConfirmationFragmentArgs。可以使⽤该类的 fromBundle() ⽅法检索参数。3.2.3 代码
代码所在分⽀:deliverparams
1、导航图代码
CFragment 的标签体中的标签就是 CFragment 要接收的数据