Navigation
AAC Jetpack Navigation Component
Android Architecture Component Library μ€ νλμΈ Navigation
μ λν΄μ λμ Ήμ΄λ΄
λλ€π§
Navigation μ΄λ?
Jetpack μ€ νλμΈ Navigation Component λ μ‘ν°λΉν°λ νλκ·Έλ¨ΌνΈ κ°μ μ΄λμ μμ μ μ΄κ³ κ°λ¨νκ² λμμ£Όλ μ»΄ν¬λνΈμ΄λ€. λν νλ©΄κ°μ μ΄λμ iOS μ storyboard μ²λΌ μ§κ΄νν μ μμ΄ μ΄ν리μΌμ΄μ μ νλ©΄νλ¦μ μ½κ² μ μ μλ€. Android Documentμ λͺ μλ λ€λΉκ²μ΄μ λμ μΌλ‘ μΈν μ₯μ μ μλμ κ°λ€.
νλκ·Έλ¨ΌνΈ νΈλμμ μ²λ¦¬
νλ©΄κ°μ μ΄λμ μ¬λ°λ₯΄κ² μ²λ¦¬
μ λλ©μ΄μ κ³Ό μ μ λν νμ€νλ 리μμ€ μ 곡
λ₯ λ§ν¬ ꡬν λ° μ²λ¦¬ μ©μ΄
μ΅μνμ μΆκ°μμ μΌλ‘ μλ¨ ν΄λ°/ νλ¨ λ€λΉκ²μ΄μ μ ν¬ν¨
Safe Args - νλ©΄ μ νκ°μ λ°μ΄ν° μ λ¬μ μ λ¬ν λ μμ μ±μ μ 곡
ViewModel μ§μ
ꡬμ±μμ
Navigation Graphλͺ¨λ λ€λΉκ²μ΄μ κ΄λ ¨ μ λ³΄κ° νλμ λͺ¨μ¬μλ XML 리μμ€μ΄λ€. μ΄ν리μΌμ΄μ λ΄ νλ©΄κ°μ μ΄λμ λν΄ νλ‘μ°λ₯Ό μ§κ΄ννμ¬ ν λμ μμ보기 μ½κ² νμΈν μ μλ€.
NavHost
Navigation Graph
μμ λμμ νμνλ λΉ μ»¨ν μ΄λμ΄λ€. ꡬμ±μμμλ νλκ·Έλ¨ΌνΈ λμμ νμνλ κΈ°λ³ΈNavHost
ꡬνμΈNavHostFragment
κ° ν¬ν¨λλ€.
NavController
NavHost
μμ μ± νμμ κ΄λ¦¬νλ κ°μ²΄μ΄λ€.NavController
λ μ¬μ©μκ° μ± λ΄μμ μ΄λν λNavHost
μμ λμ νλ©΄μ μ νμ μ‘°μ’ νλ€
ꡬν
- Navigation λΌμ΄λΈλ¬λ¦¬ μΆκ° (build.gradle)
def nav_version = "2.5.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
- Navigation Graph μΆκ°
res λλ ν 리μμ New > Android Resource File μ μ ννλ€.
νμΌλͺ μ λ ₯ (ex: nav_graph)
ResourceType μ€μ μ Navigation μΌλ‘ μ ννλ€.
- NavHost μΆκ° (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
μ‘ν°λΉν°μ νλκ·Έλ¨ΌνΈλ€μ 컨ν
μ΄λ μν μ νλ NavHost
ꡬνμΈ NavHostFragment
λ₯Ό μΆκ°νλ€.
android:name
μμ±μ NavHost ꡬνμ ν΄λμ€ μ΄λ¦μ ν¬ν¨νλ€.
app:navGraph
μμ±μ NavHostFragment λ₯Ό Navigation Graph(
νμ κ·Έλν) μ μ°κ²°νλ€.
νμ κ·Έλνλ μ¬μ©μκ° μ΄λν μ μλ μ΄ NavHostFragment μ λͺ¨λ λμμ μ§μ νλ€
app:defaultNavHost
μμ±μ true
λ‘ μ€μ νλ©΄ NavHostFragment κ° μμ€ν
λ€λ‘κ°κΈ° λ²νΌμ κ°λ‘μ±λλ€.
λμΌν λ μ΄μμμ μ¬λ¬ νΈμ€νΈκ° μλ€λ©΄(μ: μ°½μ΄ 2κ°μΈ λ μ΄μμ) ν νΈμ€νΈλ§ κΈ°λ³Έ NavHostλ‘ μ§μ ν΄μΌ νλ€.
- Navigation Graph λμ μΆκ°
μ΄μ λ€λΉκ²μ΄μ
μμ μ¬μ©ν νλκ·Έλ¨ΌνΈλ€μ nav_graph.xml μ μΆκ°νλ€.
nav_graph.xml νμΌμ μ΄κ³ μλμ μ¬μ§μ νμλ λ²νΌμ ν΄λ¦νλ©΄ νλκ·Έλ¨ΌνΈ ν΄λμ€ λͺ©λ‘μ΄ λ ΈμΆλλ©° λλΈ ν΄λ¦ μ, κ·Έλνμ ν΄λΉ νλκ·Έλ¨ΌνΈκ° μΆκ°λλ€.


app:startDestination
μμ±μ navHostλ‘ μ§μ λ ν΄λΉ μ‘ν°λΉν°κ° μ€νλμμ λ, μ²μμΌλ‘ μμνλ νλ©΄μ€μ μ΄λ€. μλ fragment
νκ·Έμ μ μλ id μ λμΌν΄μΌ νλ€.
android:label
μμ±μ μ¬μ©μκ° μ½μ μ μλ λμ μ΄λ¦μ ν¬ν¨νλ€. μλ‘ NavGraph λ₯Ό setupWithNavController()λ₯Ό μ¬μ©νμ¬ Toolbarμ μ°κ²°ν κ²½μ°, UIμ ν΄λΉ λΌλ²¨ κ°μ΄ νμλλ€.
tools:layout
μμ±μ ν΄λΉ νλκ·Έλ¨ΌνΈμ λ μ΄μμμ μ°κ²°νμ¬ κ·Έλν νλ©΄μμ ν΄λΉ νλ©΄μ 미리보μ¬μ€ μ μλ€.
- νλ©΄κ°μ μ΄λ ꡬν
νλκ·Έλ¨ΌνΈλ₯Ό νλ λ μμ±νκ³ , μμ κ°μ λ°©μμΌλ‘ νμ κ·Έλνμ λμμ μΆκ°νλ€.

νλκ·Έλ¨ΌνΈλ₯Ό μΆκ°νκ³ Navigation Editor
μμ νΉμ νλκ·Έλ¨ΌνΈλ₯Ό ν΄λ¦νλ©΄ μ μ¬μ§κ³Ό κ°μ΄ μ€λ₯Έμͺ½ μ€μμ ν° λκ·ΈλΌλ―Έκ° νμλλ€. ν΄λΉ λ²νΌμ ν΄λ¦ ν μ±λ‘ μ΄λνλ €λ λμ(listFragment) λ‘ λκ³ κ°λ©΄ XML μ½λμμ action
μ΄λΌλ νκ·Έκ° μμ±λλ©° νλ©΄μ ν λμ μ§μ μ λμ΄λ€.
μ΄λ λ°©λ²μ μλμ κ°λ€.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Handler(Looper.getMainLooper()).postDelayed({
// νλ©΄μ΄λμ ν_1
findNavController().navigate(R.id.action_homeFragment_to_listFragment2)
// νλ©΄μ΄λμ ν_2 todo: safe-args λ λ§μ΄ μ¬μ©
val hl = HomeFragmentDirections.actionHomeFragmentToListFragment2()
findNavController().navigate(hl)
}, 500)
}
νλ©΄μ ν 1λ²λ°©μμ nav_graph νμΌμ μ μλ μ‘μ νκ·Έμ μμ΄λμ λμΌνλ€ νλ©΄μ ν 2λ²λ°©μμ μΆνμ μμ±ν safe-args κ΄λ ¨νμ¬ νλ¬κ·ΈμΈ μ€μ ν μ¬μ©μ΄ κ°λ₯νλ€
NavDirections
NavDirection μ Activity μ€νκ³Ό λΉκ΅νλ©΄ Intent μ λΉμ·νλ€. κ°λ°μκ° μ§μ μ€μ νλκ² μλ, Navigationμ μν΄ μλμΌλ‘ μμ±λλ ν΄λμ€μ΄λ€. μ μμ μ½λμμ μΈκΈν SafeArgs λ Bundle μμ NavGraph μ μΈκ³Ό λμΌν Type Dataλ₯Ό κ°μ Έμ€λ Helperλ‘ μκ°νλ©΄ λλ€.
Last updated