본문 바로가기
Development/Android (Kotlin)

JetPack의 Navigation을 사용해보자

by 아보카도1 2020. 10. 19.

안녕하세요 진짜 초보개발자 아보카도🥑입니다. 오늘은 간단한 예제와 함께 JetPack의 Navigation을 알아보겠습니다.

 

저는 처음에 공부할 때 intent와 transaction으로만 화면 이동을 했었는데, 레이아웃이 복잡해질수록 코드도 꼬이고 불편했습니다. 

쉽게 쉽게 하고싶지만 모든 앱이 그렇게 간단하지 않다는 것 .. ! 

 

이제는 쓰지 않으면 불편한 navigation 기능을 예제와 함께 볼게요

 

 

네비게이션으로 연결한 예제

 

 

 

 

위에서 언급한 Android JetPack은 훌륭한 안드로이드 앱을 만들기 위한 컴포넌트, 도구, 안내서의 세트입니다. 

 

https://github.com/android/sunflower

특히 아키텍쳐 부분을 하나씩 공부해보면 좋을 것 같아요. 

 

 


 

네비게이션은 총 세가지 파트로 나눕니다

 

1. Navigation graph (New XML Resource)

https://developer.android.com/guide/navigation/navigation-getting-started

새로운 리소스 타입인 네비게이션 그래프는 모든 정보가 모여있어요. XML 코드로도 확인할 수 있습니다. 

각각의 스크린들은 destination이라는 이름을 갖고 있고 가고싶은 곳으로 연결을 할 수 있습니다.

 

한눈에 보이니까 너무 좋지 않나요?

 

그리고 모두 프레그먼트 입니다. 구글이 하나의 액티비티 + 여러개의 프레그먼트 구성을 밀고 있기 때문이죠.

 

자세한 내용은 영상으로  youtu.be/2k8x8V77CrU

 

 

 

2. NavHostFragment (Layout XML view)

 

https://codelabs.developers.google.com/codelabs/android-navigation/#4

빈 창이라고 보면 되는데요, 프레그먼트 네비게이션을 위한 빈 위젯이라고 생각하면 됩니다. 

 

 

 

3. NavController (Kotlin / Java object)

findNavController().navigate(<Destination or Action id>)

말 그대로 네비게이션을 컨트롤합니다. NavHostFragment는 개별적으로 NavController를 가지고 있어요. 

네비게이션 그래프 정보를 바탕으로 네비게이션 간 이동(액션)을 담당합니다. 

 

 

 


 

이제 다 만들어진 페이지들을 네비게이션으로 연결해보겠습니다. 

 

먼저 build.gradle 파일에 navigation dependency(의존성)를 추가해줍니다.

코틀린 기준입니다.

자바는  implementation "androidx.navigation:navigation-fragment:2.3.0"
           implementation
"androidx.navigation:navigation-ui:2.3.0"

 

 

sync까지 해주면 추가 완료!

 

 

네비게이션 파일을 만듭니다

res > new > Android Resource File

file name은 nav_graph, resource type은 navigation으로 해줍니다.

이렇게 하면 네비게이션 폴더와 그 안에 네비게이션 파일이 생성되었습니다. 

 

 

완성된 네비게이션 파일에 프레그먼트(페이지) 추가

네비게이션 내에서 destination 이라고 하는, 우리가 미리 만든 페이지들을(프레그먼트와 레이아웃 파일) 추가해주겠습니다. 

 

킵고잉 킵고잉 ~

 

 

activity_main.xml 파일에 NavHostFragment 추가

XML 파일에 기본으로 들어가 있는 텍스트를 지우고 프레그먼트를 넣어줍니다. 

(developer.android.com/guide/navigation/navigation-getting-started 네비게이션 가이드 참고)

가이드에선 FragmentContainerView를 넣으라고 하지만 저는 fragment(소문자)를 넣었습니다. (코드는 동일)

 

이것이 하나의 액티비티 + 여러 개의 프레그먼트의 시작입니다.  

위에서 언급한 NavHostFragment가 id에서 보이시나요? 이제 이 액티비티 안에 있는 프레그먼트가 빈 창을 만들어줍니다. 

 

 

프레그먼트 연결

nav_graph 파일을 들어가서 연결하려고 보니 페이지의 프리뷰가 안나옵니다. 페이지가 보이게 하고 싶어서 코드 한줄 넣어주겠습니다.

 

 

네비게이션 파일의 코드에서 프레그먼트와 해당 레이아웃을 tools:layout="@layout/layout_name" 이걸로 연결해줍니다.

네비게이션에도 tools가 있어야 에러가 안 뜨니 추가해주세요 

 

 

 

변경☆완료

 

 

드디어 연결을 해보겠습니다. 화살표를 쭈욱 땡겨서 가고싶은 페이지로 연결을 해줍니다. 

 

연결을 해주면 코드 상에서도 연결해준 "액션"이 나타납니다

action_출발_to_도착 이라고 보면 됩니다.

 

 

저는 퀴즈가 틀리면 다시 시작페이지로 돌아가는 액션까지 만들어주었습니다. 

 

 

이제 끝났나? ! 싶지만 실질적인 연결, 즉 NavController를 사용할 때가 왔습니다.

저는 버튼을 통해 페이지 이동을 하니, 버튼을 만져주겠습니다. 

 

 

버튼 연결

버튼을 연결해주기 전에, 각 버튼에 정확한 id를 레이아웃 파일에서 설정해주세요.

 

그리고 Main Activity에서 NavController를 정의해줍니다.

onCreate에 findNavController 메소드를 사용하여 NavController를 검색할 수 있습니다.

전의 액티비티에서 발견한 NavHost를 찾는 메소드입니다. 

 

 

첫 시작 프레그먼트로 가서 버튼에 액션을 추가해주겠습니다. 

아까와 동일하게 NavController를 선언해주고 onViewCreated에서 받아온 view를 통해 NavController를 정의해줍니다.

 

마지막으로 버튼의 아이디를 가져와, setOnClickListener를 사용해줍니다. 

R.id.action_출발_to_도착   기억하시죠? 

 

NavController를 이용해 "액션"을 탐색하는 겁니다. 

 

 

 

이렇게 하면 네비게이션 그래프에서 설정했듯이 다음 페이지로 넘어가게 됩니다. 

 

다른 프레그먼트도 동일하게 적용하면 네비게이션이 성공적으로 되는 것을 알 수 있습니다. 

 


˙참고자료

Android Get Started with the Navigation component developer.android.com/guide/navigation/navigation-getting-started 

 

댓글