Navigation

AAC Jetpack Navigation Component

Android Architecture Component Library ์ค‘ ํ•˜๋‚˜์ธ Navigation ์— ๋Œ€ํ•ด์„œ ๋„์ น์–ด๋ด…๋‹ˆ๋‹ค๐Ÿง

Jetpack ์ค‘ ํ•˜๋‚˜์ธ Navigation Component ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ฐ„์˜ ์ด๋™์„ ์•ˆ์ •์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ๋˜ํ•œ ํ™”๋ฉด๊ฐ„์˜ ์ด๋™์„ iOS ์˜ storyboard ์ฒ˜๋Ÿผ ์ง๊ด€ํ™”ํ•  ์ˆ˜ ์žˆ์–ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™”๋ฉดํ๋ฆ„์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Android Document์— ๋ช…์‹œ๋œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋„์ž…์œผ๋กœ ์ธํ•œ ์žฅ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ํ”„๋ž˜๊ทธ๋จผํŠธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ

  • ํ™”๋ฉด๊ฐ„์˜ ์ด๋™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ

  • ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ „์— ๋Œ€ํ•œ ํ‘œ์ค€ํ™”๋œ ๋ฆฌ์†Œ์Šค ์ œ๊ณต

  • ๋”ฅ ๋งํฌ ๊ตฌํ˜„ ๋ฐ ์ฒ˜๋ฆฌ ์šฉ์ด

  • ์ตœ์†Œํ•œ์˜ ์ถ”๊ฐ€์ž‘์—…์œผ๋กœ ์ƒ๋‹จ ํˆด๋ฐ”/ ํ•˜๋‹จ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ํฌํ•จ

  • Safe Args - ํ™”๋ฉด ์ „ํ™˜๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์ „๋‹ฌํ•  ๋•Œ ์•ˆ์ •์„ฑ์„ ์ œ๊ณต

  • ViewModel ์ง€์›

๊ตฌ์„ฑ์š”์†Œ

๋ชจ๋“  ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ํ•˜๋‚˜์˜ ๋ชจ์—ฌ์žˆ๋Š” XML ๋ฆฌ์†Œ์Šค์ด๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ํ™”๋ฉด๊ฐ„์˜ ์ด๋™์— ๋Œ€ํ•ด ํ”Œ๋กœ์šฐ๋ฅผ ์ง๊ด€ํ™”ํ•˜์—ฌ ํ•œ ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Navigation Graph์—์„œ ๋Œ€์ƒ์„ ํ‘œ์‹œํ•˜๋Š” ๋นˆ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. ๊ตฌ์„ฑ์š”์†Œ์—๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ๋Œ€์ƒ์„ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋ณธ NavHost ๊ตฌํ˜„์ธ NavHostFragment ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

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 ์ถ”๊ฐ€

  1. res ๋””๋ ‰ํ† ๋ฆฌ์—์„œ New > Android Resource File ์„ ์„ ํƒํ•œ๋‹ค.

  2. ํŒŒ์ผ๋ช… ์ž…๋ ฅ (ex: nav_graph)

  3. 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 ํŒŒ์ผ์„ ์—ด๊ณ  ์•„๋ž˜์™€ ์‚ฌ์ง„์— ํ‘œ์‹œ๋œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋ž˜๊ทธ๋จผํŠธ ํด๋ž˜์Šค ๋ชฉ๋ก์ด ๋…ธ์ถœ๋˜๋ฉฐ ๋”๋ธ” ํด๋ฆญ ์‹œ, ๊ทธ๋ž˜ํ”„์— ํ•ด๋‹น ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๊ทธ๋ž˜ํ”„์— ์ฒ˜์Œ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด tools:layout ์†์„ฑ์„ ์ œ์™ธํ•˜๊ณ  ์œ„์™€ ๊ฐ™์€ ์†Œ์Šค๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

app:startDestination ์†์„ฑ์€ navHost๋กœ ์ง€์ •๋œ ํ•ด๋‹น ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ, ์ฒ˜์Œ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™”๋ฉด์„ค์ •์ด๋‹ค. ์•„๋ž˜ fragment ํƒœ๊ทธ์— ์ •์˜๋œ id ์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. android:label ์†์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ์ด๋ฆ„์„ ํฌํ•จํ•œ๋‹ค. ์˜ˆ๋กœ NavGraph ๋ฅผ setupWithNavController()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Toolbar์™€ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ, UI์— ํ•ด๋‹น ๋ผ๋ฒจ ๊ฐ’์ด ํ‘œ์‹œ๋œ๋‹ค. tools:layout ์†์„ฑ์€ ํ•ด๋‹น ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋ ˆ์ด์•„์›ƒ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ทธ๋ž˜ํ”„ ํ™”๋ฉด์—์„œ ํ•ด๋‹น ํ™”๋ฉด์„ ๋ฏธ๋ฆฌ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

- ํ™”๋ฉด๊ฐ„์˜ ์ด๋™ ๊ตฌํ˜„

ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•˜๊ณ , ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰ ๊ทธ๋ž˜ํ”„์— ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์˜ค๋ฅธ์ชฝ listFragment๋Š” 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 ๊ด€๋ จํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ํ›„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

NavDirection ์€ Activity ์‹คํ–‰๊ณผ ๋น„๊ตํ•˜๋ฉด Intent ์™€ ๋น„์Šทํ•˜๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, Navigation์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์œ„ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ SafeArgs ๋Š” Bundle ์—์„œ NavGraph ์„ ์–ธ๊ณผ ๋™์ผํ•œ Type Data๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Helper๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Last updated