[Day12] Android - Kotlin笔记:JetPack - Fragments在Navigation中的参数传递(Safe Args)

Fragments在Navigation中的参数传递 - SafeArgs

继上篇我们得知如何运用NavigationFragment中做页面切换。
而今天要讲的是Safe Args
他的作用是在Fragment中页面切换时,传递参数(Arguments)。


首先要在app的build.gradle加入:

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.3.5")
    implementation("androidx.navigation:navigation-fragment-ktx:2.3.5")
    implementation("androidx.navigation:navigation-ui-ktx:2.3.5")
}

module层的build.gradle

apply plugin: "androidx.navigation.safeargs.kotlin"

我们将昨天的navigation.xml打开,会看到所有页面。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    app:startDestination="@id/aFragment"
    android:id="@+id/nav_graph">
    <fragment
        android:id="@+id/aFragment"
        android:name="com.example.cashdog.cashdog.AFragment"
        android:label="@string/label_blank"
        tools:layout="@layout/fragment_blank" >
        <action
            android:id="@+id/action_aFragment_to_bFragment"
            app:destination="@id/bFragment" />
    </fragment>
    <fragment
        android:id="@+id/bFragment"
        android:name="com.example.cashdog.cashdog.BFragment"
        android:label="@string/label_blank_2"
        tools:layout="@layout/fragment_blank_fragment2" />
</navigation>

假设我们要从AFragment传递参至BFragment
会在BFragment底下加入:

<argument
        android:name="userName"
        app:argType="string" 
        app:nullable="false"/>
  • android:name: 可以视为argument的id
  • app:nullable: AFragment页面转到BFragment时,是否为必传值。false为必填,true可不填。
  • app:argType: argument的型态。

app:argType能选择的类型有:

加入navigation.xml中,会像这样:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    app:startDestination="@id/aFragment"
    android:id="@+id/nav_graph">
    <fragment
        android:id="@+id/aFragment"
        android:name="com.example.cashdog.cashdog.AFragment"
        android:label="@string/label_blank"
        tools:layout="@layout/fragment_blank" >
        <action
            android:id="@+id/action_aFragment_to_bFragment"
            app:destination="@id/bFragment" />
    </fragment>
    <fragment
        android:id="@+id/bFragment"
        android:name="com.example.cashdog.cashdog.BFragment"
        android:label="@string/label_blank_2"
        tools:layout="@layout/fragment_blank_fragment2">
        <argument
            android:name="userName"
            app:argType="string" 
            app:nullable="false"/>
    </fragment>
</navigation>

传递args的方式

直接将要传递的参数写入actionAFragmentToBFragment(argument)中,

val action = AFragmentDirections.actionAFragmentToBFragment(userName)
class AFragment : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                val action = AFragmentDirections.actionAFragmentToBFragment(userName)
                view.findNavController().navigate(action)
            }
    }
}

取得args的方式 - by navArgs

BFragment中取得传递过来的argument包裹:

val args by navArgs<BFragmentArgs>()

直接获取argument中的内容方式如下:

val userName = args.userName
class BFragment : Fragment() {

    private val args by navArgs<BFragmentArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val userName = args.userName
    
     }
     ...

}

比起以前的写法相较快很多:

val userName = arguments?.getString("userName") ?: ""

参考:


<<:  【Day 6】make x Makefile x 任贤齐的救星

>>:  musl libc 简介与其 porting(五) Knocking on Heaven's Door

[Day 15] 在Arduino IDE中用Arm CMSIS 牛刀小试一下

在[Day 14] tinyML开发框架(二):Arm CMSIS 简介已初步帮大家介绍了Arm C...

Day 10 利用 Cloudflare 来管理你的网域和子网域

将你所购买的网域名称,透过 Cloudflare 来设定 DNS 的好处多多。除了可以预防一些基本的...

Day 24:「Switch 也要换游戏片啦~」- Slot 插槽

不知道大家有没有买 Switch 呢? 虽然兔兔没有 Switch, 但我知道有游戏片都不便宜呀!...

Day30 Open-Match 使用与参赛心得

很开心能够完成 30天的 Open-Match 文章分享,其实中间有些东西,是我一边研究一边写出来的...

Day 6 - Rancher 系统管理指南 - 使用者登入管理

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...