继上篇我们得知如何运用Navigation
在Fragment
中做页面切换。
而今天要讲的是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
的idapp: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 14] tinyML开发框架(二):Arm CMSIS 简介已初步帮大家介绍了Arm C...
将你所购买的网域名称,透过 Cloudflare 来设定 DNS 的好处多多。除了可以预防一些基本的...
不知道大家有没有买 Switch 呢? 虽然兔兔没有 Switch, 但我知道有游戏片都不便宜呀!...
很开心能够完成 30天的 Open-Match 文章分享,其实中间有些东西,是我一边研究一边写出来的...
本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...