NavController

Project 的 build.gradle

img

專案的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"
  }
}

results matching ""

    No results matching ""