Pa K'ode

[안드로이드] Navigation Components 들을 알아보자 본문

안드로이드

[안드로이드] Navigation Components 들을 알아보자

Paku 2022. 12. 5. 14:42

안녕하세요, 안드로이드 개발자 파쿠입니다 :)

 

오늘 다뤄볼 내용은 안드로이드 정통 컴포넌트 중 하나인

Navigation에 대해서 정리해보려고 합니다.

 

저도 요즘 들어 가장 선호하는 방식이기도 하며

액티비티를 많이 사용하지 않아서

프로젝트 관리가 더 편해진다는 장점도 있습니다.

 

왜 사용하는가?

직접 사용하고, 프로젝트를 세팅하면서 좋다고 느낀 장점 두 가지가 있습니다,

 

첫 번째로는, 파일 수가 줄어들어, 가독성과 버전 관리에 용의 하다는 점이 있습니다.

기존의 Container에 Fragment을 사용하는 것과 동일한 방식이지만, 굳이 Navigation을 사용하는 이유는

아래의 사진처럼 어떤 Fragment끼리 얽혀있는지, 진행 방향이 어디인지, 시각적으로 확인할 수 있어서

굳이 코드를 하나씩 찾아보지 않아도 쉽게 이해할 수 있게 됩니다.

 

 

두 번째로, 대상 간 데이터(Argument)를 전달해 줄 때 반복되는 코드를 줄여주고,

인수를 쉽고 안전하게 전달해 준다는 점이 있습니다. 

기존 방식은 FragmentManager을 호출, 탐색, 후 더해줄 fragment의

Bundle에 데이터를 담아 전달해 주는 방식이었지만 Naviagtion을 사용한다면,

<argument> 태그를 열어 추가하면 NavDestination 컴포넌트에 필요한 인자의 속성이 전달되게 됩니다. 

 

이런 점들이 프로젝트의 설계, 관리, 하는 측면으로 보았을 때 정말 좋았어서 자주 사용하게 되었습니다.

서론이 길었으니, 기본적인 사용 방법과 알아두면 좋은 점에 대해 말씀드려볼까 합니다.

 

Gradle에 Library추가

Gradle(App)

implementation("androidx.navigation:navigation-fragment-ktx:${Versions.navigation}")
implementation("androidx.navigation:navigation-ui-ktx:${Versions.navigation}")

${Versions.navigation} 이라 적힌 부분에는 최신 버전의 라이브러리 버전을 적어주시면 됩니다.

https://developer.android.com/jetpack/androidx/releases/navigation


두 번쨰로 Navigation의 SafeArg을 Project, App 수준의 gradle 플러그인에 선언해 주어야 합니다.

Gradle(Project) 

plugins {
    id("androidx.navigation.safeargs.kotlin") version("윗 버전과 동일") apply(false)
}

Gradle(App)

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

Gradle Sync 로 마무리 하시면 NavComponet를 앱에서 사용하실수 있게 됩니다.

 

Nav Graph 그려보기

 

앱 모듈의 res 폴더에 우클릭 -> New -> Android Resource Directory -> type에 navigation을 선택해 주신 후 

navigation 폴더를 생성해 줍니다. 이미 디렉토리가 있다면, 스킵하셔도 됩니다.

navigation 디렉토리에 우클릭 -> New -> Navigation Resource File 으로 navGraph를 생성 해 줍니다.

 

<navigation> 태그 안에 담고싶은 activity, fragment, 등의 레이아웃들을 추가할수 있으며,

처음보여줄 startDesination을 id값으로 지정해 줄수 있습니다.

 

NavHostFragment 추가하기

 

위에서 생성해준 NavGraph를 담아줄 FragmentContainer를 생성해 주어야 하는데요,

xml 파일에서 쉽게 추가해 줄수 있습니다.

Activity/Fragment.xml

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/container"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph" // 아까 생성한 navGraph의 id(navigation 태그안에 추가)
    app:layout_constraintBottom_toTopOf="@id/bottom"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/toolbar" />

 

속성에관한 자세한 내용은 아래 공식 문서에서 확인하실수 있습니다.

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

 

탐색 구성요소 시작하기  |  Android 개발자  |  Android Developers

탐색 구성요소 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 주제는 탐색 구성요소를 설정하고 사용하는 방법을 설명합니다. 탐색 구성요소

developer.android.com

 

NavController로 화면간 이동 해보기

 

NavController란 이전에 생성한 NavHost내의 객채입니다. NavHost 내부에서의 탐색, 대상간의 이동을 담당합니다.

NavController를 찾는 방법은 아래 함수로 찾을수 있습니다.

  • Activity: findNavController(viewId: NavHost의 id)
  • Fragment: findNavController()

호출한 NavController의 .navigate 함수를 사용하여 navGraph 에서 선언한 <action> 태그로 생성된

NavDestination를 호출하여 화면간 이동을 할수 있습니다.

 

이 외로도 activity, dialog, deepLink 등과의 이동도 간편하게 할수 있는 매력적인 컴포넌트입니다.

 

자세한 내용은 공식 페이지에도 나와있으니, 참조하셔서 코딩하시면 좋을것 같습니다.

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

대상으로 이동  |  Android 개발자  |  Android Developers

대상으로 이동 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 대상으로 이동하는 것은 NavController 객체를 사용하여 실행되며 이 객체는 NavHost 내에서 앱 탐

developer.android.com

Comments