[Android MAD Skills] Donut 앱을 통한 Navigation Component 알아보기

이영한·2021년 9월 5일
3

Android MAD Skills

목록 보기
1/1

이번 글에서는 Android MAD Skills강의에서 예시로 사용된 Donut 앱을 통해 Navigation Component에 대해 알아보겠습니다.


Android MAD Skills 강의와 Donut앱은 아래 url에 있습니다

[MAD Skills]
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc91i2QT8qfrfKgLNlJiG1z7

[Donut App]
https://github.com/android/architecture-components-samples/tree/main/MADSkillsNavigationSample

1. Navigation 구성요소

Navigation을 구성하는 요소에 대해 알아봅시다

1) Navigation Host Fragment

네비게이션에 의해 나타날 콘텐츠를 보여주는 fragment입니다. donut app의 navigation host fragmet 코드는 아래와 같습니다

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

하나씩 살펴봅시다.

  • android:name : fragment를 구현하는 클래스를 나타냅니다. 따라서 "androidx.navigation.fragment.NavHostFragment"라고 꼭 명시해줘야 합니다.
  • app:navGraph : Navigation Host Fragmet가 사용할 navigation graph를 지정합니다.

2) Navigation Graph

네비게이션에 포함될 fragment와 fragment 사이의 이동을 지정할 수 있는 그래프 입니다. 아래는 donut 앱의 navigation graph입니다.

nav_graph를 보면 donutListFragment가 기본 fragment로 지정되어 있습니다.
또한 donutEntryDialogFragment가 존재합니다.
그리고 donutListFragment에서 donutEntryDialogFragment로 이동할 수 있습니다.

한 fragment에서 다른 fragment로의 이동은 fragment 사이 action을 통해 이루어집니다.
donut app에서는 action_donutList_to_donutEntryDialogFragment 라는 이름으로 action을 정의했습니다.
action을 만들면 gradle plugin에서 자동으로 Direction Class를 만들어 줍니다.
이에 대해서는 Safe Args에서 더 자세히 살펴봅시다.

3) Navigation Controller

Navigation Graph의 fragment 사이의 이동을 담당하는 클래스 입니다. findNavController함수를 통해 객체를 받을 수 있습니다.


2. Safe Args를 통한 Argument 전달하기

1) Safe Args를 사용해야 하는 이유

새로운 Activity 혹은 Fragment로 이동할 때 argument를 전달해야할 경우가 있습니다. 보통은 Bundle을 사용하여 argument를 저장한 후, Intent를 만들 때 해당 bundle을 인자로 넘겨주는 방식을 사용합니다. 하지만 Navigation Component에서는 Safe Args를 지원합니다.

Safe Args는 gradle plugin에서 지원하는 기능으로 다음의 장점이 있습니다

  • Bundle과 관련된 boiler-plate 코드를 지울 수 있다.
  • type-safety가 보장된다.

이는 gradle plugin에 의해 자동적으로 direction에 argument가 포함되기 때문에 가능합니다.

2) Safe Args 사용하기

buld.gradle 설정

Safe Args를 사용하기 위해서는 build.gradle 파일 설정이 필요합니다.

[ project build.gradle ]

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

[ app build.gradle ]

apply plugin: "androidx.navigation.safeargs.kotlin"

Safe Args 사용방법

Safe Args를 사용하기 는 argument를 필요로 하는 fragment에서 정의합니다. donut 앱에서는 donutEntryDialogFragment에서 itemId라는 argmument를 정의했습니다.

itemId 값은 도넛을 생성하거나 수정하는 dialogFragment를 띄울 때 기존에 있는 정보를 가져오기 위해 사용합니다.

argument를 추가하니 direction클래스에 parameter가 자동으로 추가된것을 알 수 있습니다

private data class ActionDonutListToDonutEntryDialogFragment(
    val itemId: Long = -1L
  ) : NavDirections

해당 action은 navigation Controller의 navigate 함수를 통해 사용합니다.

findNavController().navigate(
	DonutListDirections.actionDonutListToDonutEntryDialogFragment(donut.id)
)



[참고자료]

https://developer.android.com/guide/navigation/navigation-getting-started?hl=ko

profile
간단하게 개발하고 싶습니다

0개의 댓글