Android Navigation Component — Part.2

Natcha Jintanasatien
te<h @TDG
Published in
2 min readJun 7, 2020

เนื้อหา part นี้จะพาทุกคนไปทำความรู้จักกับ Safe Args กันค่ะ

Photo by freepik.com

Safe Args

คือ plugin เพื่อ navigate และส่ง data ไปยัง destination อื่นๆ มีการ generate direction class เช่น MainFragmentDirections class และ generate data class สำหรับ Bundle เช่น MainFragmentArgs

เปรียบเทียบ Before vs After

Before (ไม่ใช้ Safe Args)

findNavController().navigate(
R.id.action_mainFragment_to_aboutFragment
)

After (ใช้ Safe Args)

findNavController().navigate(
MainFragmentDirections.actionMainFragmentToAboutFragment()
)

แล้ว Safe อย่างไร

จากเดิมใช้ bundle ส่งข้อมูลระหว่าง fragment หรือ activity ฝั่งปลายทางจะต้องกำหนด key และ type ของข้อมูลให้ตรงกัน ถึงจะได้ข้อมูลมาใช้งาน แต่ Safe Args ทำให้ชีวิตง่ายขึ้น เพราะ direction class รับ bundle และ properties ที่แมตช์กับ argument ใน xml ทำให้ type ข้อมูลถูกต้องเสมอ

เริ่ม Setup

ใน build.gradle(app) เพิ่ม apply plugin ดังนี้

  • สำหรับ Module ที่มี Java กับ Kotlin ปนกัน
apply plugin: "androidx.navigation.safeargs"
  • สำหรับ Kotlin Module ล้วนๆ
apply plugin: "androidx.navigation.safeargs.kotlin"

ใน build.gradle(project) เพิ่ม classpath ดังนี้

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.1"

การส่ง Data ไปยัง Destination

ทำได้โดยกำหนด argument ที่ navigation graph ใน fragment ปลายทางที่รับข้อมูล ตามนี้

<fragment
android:id="@+id/accountFragment"
android:name="com.truedigital.navigation.me.AccountFragment">

<argument
android:name="message"
android:defaultValue="Hello"
app:argType="string"
app:nullable="true" />
<argument
android:name="number"
app:argType="integer"
app:nullable="false" />
<argument
android:name="account_id"
android:defaultValue="1"
app:argType="string" />
<action... />
</fragment>
  • 1 <argument…/> คือ 1 parameter
  • android:name กำหนดชื่อ parameter
  • app:argType กำหนด type of parameter เช่น string, integer, boolean, parcelable, serializable, enum, resource reference
  • android:defaultValue(optional) กำหนดค่า default
  • app:nullable(optional) กำหนดว่าเป็น nullable หรือไม่

อย่าลืม!! Rebuild ก่อนใช้งาน เพราะ diraction class ยังไม่ถูกสร้างเลย

ตัวอย่างการส่ง Data

findNavController().navigate(
MeFragmentDirections.actionMeFragmentToAccountFragment(
message = "Account Page",
number = 10,
accountId = "2"

)
)

ตัวอย่างการรับ Data

arguments?.let { arguments ->
val args = AccountFragmentArgs.fromBundle(arguments)

val message = args.message
val number = args.number
val id = args.accountId

ตัวอย่าง Parcelable

  • set argument ใน navigation graph
<argument
android:name="inboxModel"
android:defaultValue="@null"
app:argType="com.package.InboxModel"
app:nullable="true" />
  • การส่ง Data
findNavController().navigate(
MeFragmentDirections.actionMeFragmentToInboxFragment(
inboxModel = InboxModel().apply {
id = "123"
title = "inbox 1"
description = "inbox description"
}
)
)
  • การรับ Data
arguments?.let { arguments ->
val args = InboxFragmentArgs.fromBundle(arguments)
val model = args.inboxModel
}

--

--