Android Jetpack Navigation與Safe Args使用

1. 摘要
2. 新增Navigation依賴
3. 基本使用方法
4. 使用Navigation Safe Args

1. 摘要

參考:Navigation使用官網Safe Args傳遞資料官網

使用Navigation 做Fragment之間的切換,可以更便利,更清楚誰與誰之間做導航

Safe Args 傳遞安全的數據,是官網強烈建議使用,當然也可以不使用,用原本的Bundle做傳遞

2. 新增Navigation依賴

在build.gradle中新增以下

dependencies {
    ...
    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
    implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
}

3. 基本使用方法

在app/src/main/res新增Direction: navigation

在navigation資料夾上新增

navigation裡面新增以下程式碼

<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/navigation"
app:startDestination="@id/navHomeFragment">
<fragment
android:id="@+id/navHomeFragment"
android:name="com.example.myapplication.fragment.NavHomeFragment"
android:label="NavHomeFragment"
tools:layout="@layout/fragment_nav_home">
<action
android:id="@+id/action_navHomeFragment_to_navSecondFragment"
app:destination="@id/navSecondFragment" />
</fragment>
<fragment
android:id="@+id/navSecondFragment"
android:name="com.example.myapplication.fragment.NavSecondFragment"
android:label="NavSecondFragment"
tools:layout="@layout/fragment_nav_second"/>
</navigation>

startDestination是起始的fragment
action是拉線後自動會新增的,看id名字很明顯可以知道是哪導航到哪

在Activity的layout中新增以下程式碼

<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:navGraph="@navigation/navigation"/>

navGraph是剛剛新增的navigation.xml
androidx.navigation.fragment.NavHostFragment是固定的別打錯
app:defaultNavHost="true" 屬性確保您的 NavHostFragment 會攔截系統返回按鈕

Activity onCreate新增Nav

lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_navigation)
    navController = Navigation.findNavController(this, R.id.fragment)
    NavigationUI.setupActionBarWithNavController(this, navController)
}

override fun onSupportNavigateUp(): Boolean {
    //按back返回的方法
    return navController.navigateUp()
}

Fragment 更換介面方式

下面的id是先前那個action的id

可以帶入bundle,也可以不帶入

val bundle = bundleOf(
"name" to firstName,
"mobile" to mobile.toLong()
)

findNavController().navigate(
R.id.action_enterDetailsFragment_to_verifyDetailsFragment,
bundle
)

讀取bundle方式,在目的地的Fragment onCreateView,新增以下程式碼

val name = arguments?.getString("name")
val mobileNumber = arguments?.getLong("mobile")

4. 使用Navigation Safe Args

官方強烈建議您將 Safe Args 用於導航和數據傳遞,因為它可以確保類型安全

新增依賴

在Project build.gradle新增以下

dependencies {
    def nav_version = "2.3.5"
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}

在app build.gradle新增以下

plugins {
    id 'androidx.navigation.safeargs.kotlin'
}

新增完依賴後

Build -> clean Project

Build -> Rebuild Project

選擇Android
在Java(generated)會出現這張圖的內容

Android Studio 4.1以上版本,如果navigation已建立好,並新增上述依賴,如果沒出現的話

在app build.gradle內新增以下內容

android {
    sourceSets {
        getByName("main").java.srcDirs("build/generated/source/navigation-args")
    }
}

新增好後

Build -> clean Project

Build -> Rebuild Project

此時會在Java內出現這張圖的內容

如果有出現就是成功添加囉

使用方法

原本是以下程式碼

val bundle = bundleOf(
    "name" to firstName,
    "mobile" to mobile.toLong()
)
findNavController().navigate(
    R.id.action_enterDetailsFragment_to_verifyDetailsFragment,
    bundle
)

使用safe args時,至navigation VerifyDetailsFragment 新增argument

<fragment xxxxx>
    <argument android:name="name"
        app:argType="string"/>
    <argument android:name="mobile"
        app:argType="long"/>
</fragment>

新增好後Build -> Make Project

就可以改用下方用法囉

findNavController().navigate(
EnterDetailsFragmentDirections.actionEnterDetailsFragmentToVerifyDetailsFragment(
        firstName,
        mobile.toLong()
    )
)

讀取方法如下

原本讀取方法

val name = arguments?.getString("name")
val mobileNumber = arguments?.getLong("mobile")

變更為以下方法

val args: VerifyDetailsFragmentArgs by navArgs()
args.let {
println("name ${it.name}, mobile ${it.mobile}")
}

這就是使用Safe Args的方法


相關文章

Android Navigation搭配BottomNavigationView
1. 摘要
2. 使用方法
3. BottomNavigationView取消內建顏色變化

訂閱Codeilin的旅程,若有最新消息會通知。

對「Android Jetpack Navigation與Safe Args使用」的一則回應

Add yours

發表留言

透過 WordPress.com 建置的網站.

向上 ↑

使用 WordPress.com 設計專業網站
立即開始使用