NavController
Project 的 build.gradle

專案的build.gradle,在plugins{}上方,加上buildscript {}的內容。
1
2
3
4
5
6
7
8
9
10
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
dependencies {
def nav_version = "2.9.5"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
}
plugins {
.....
}
app 的 build.gradle
在app中的build.gradle,plugins {}加上id 'androidx.navigation.safeargs.kotlin'
1
2
3
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
在app中的build.gradle,dependencies {}中加上implementation
1
2
3
4
5
6
dependencies {
def nav_version = "2.9.5"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
注意 以下這行不能加在app中的build.gradle
implementation "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
settings.gradle
settings.gradle,要確保是google(),中間沒加奇奇怪怪的東西。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "coroutine"
include ':app'
注意!!!!接下來要Sync
res目錄下的navigation
注意!homeFrag是沒有參數,只有action。
fragA才有argument。
navigation1.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation1"
app:startDestination="@id/homeFrag">
<fragment
android:id="@+id/homeFrag"
android:name="com.example.coroutine.fragment.HomeFrag"
android:label="HomeFrag">
<action
android:id="@+id/action_homeFrag_to_fragA"
app:destination="@id/fragA" />
</fragment>
<fragment
android:id="@+id/fragA"
android:name="com.example.coroutine.fragment.FragA"
android:label="FragA">
<argument
android:name="username"
android:defaultValue="unknow"
app:argType="string" />
<argument
android:name="address"
android:defaultValue="unknow"
app:argType="string" />
</fragment>
</navigation>
Fragment
HomeFrag 傳送參數
1
2
val action = HomeFragDirections.actionHomeFragToFragA(username = "abcd", address = "dddd")
findNavController().navigate(action)
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.coroutine.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.coroutine.databinding.FragmentHomeBinding
class HomeFrag : Fragment() {
private lateinit var binding: FragmentHomeBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentHomeBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.navBtn1.setOnClickListener {
val action = HomeFragDirections.actionHomeFragToFragA(username = "abcd", address = "dddd")
findNavController().navigate(action)
}
}
}
FragA 接收參數
1
2
3
val args = FragAArgs.fromBundle(requireArguments())
val username = args.username
val address = args.address
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.coroutine.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.coroutine.databinding.FragmentMyBinding
class FragA: Fragment() {
private lateinit var binding: FragmentMyBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentMyBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val args = FragAArgs.fromBundle(requireArguments())
val username = args.username
val address = args.address
binding.nameTv.text = "username = $username address = $address"
}
}