본문 바로가기

안드로이드

navigation

기존에 프레그먼트를 사용해서 화면을 구성하면 꽤 귀찮다. 한참을 분석해야지 어떤 동작을 하면 어떤 화면으로 넘어가지는지 파악이 된다. 난 navigation을 공부하고 나서 위에 언급한 단점을 상쇄해준다고 느꼈다. 아래와 같이 직관적으로 어디서 어디로 이동하는지 보여주니까 말이다.

 

이 게시글을 통해서 개념을 익히는 것도 중요하지만 실제로 코드를 이리저리 만져보는것도 중요하다. 글의 가장 아래에 내가 만들어둔 예시 프로젝트 링크를 첨부해놓겠다. (많관부)

 

 

아래는 공식문서에서 얘기하는 navigation을 사용했을때의 이점이다.

네비게이션을 사용했을때 이점
  1. 일관성있게 화면이 전환되고 애니메이션 효과를 적용할 수 있다.
  2. 딥링크를 구현하고 관리할 수 있다. (사용자가 보고자 하는 화면으로 이동시킬때 딥링크 사용)
  3. 몇가지 추가작업만 하면 되는 navigation drawers 나 navigation과 같은 패턴을 제공해준다.
    (개발자가 작업해야할게 훨씬 줄어든다는 의미인듯)
  4. 목적지 화면까지 타입 안정성이 보장된 데이터를 보내줄 수 있다.
    (type safety 라고 하는 플러그인을 추가하고 나면 쓸 수 있다. 컴파일 타임에 값을 설정해서 데이터를 목적지 화면까지 보낼 수 있기 때문에 예상하지 못한 객체를 받을 일이 없다.)
  5. 뷰모델 제공
    (뷰모델 스코프를 허용해서 화면간의 ui와 관련된 데이터를 공유할 수 있다.)
  6. FragmentTransaction 을 제공해준다.
  7. Back and up: Handles back and up actions correctly by default.
    (원문만 봐서는 뜻을 잘 모르겠다. 짐작컨데 navigation에 화면(frament) 스택이 쌓여서 개발자가 의도하지 않은 화면을 보여줄 수 있었던 것들을 더 쉽게 관리할 수 있게 해준다는 말인듯)

출처 : https://developer.android.com/guide/navigation

 

Navigation에는 중요한 세가지 개념이 있다. 1. Navigation graph 위의 사진이 바로 네비게이션 그래프다. 하나의 xml 파일 안에 화면간 어떻게 이동할지 다 정리되어있다. 밑에 언급한 내가 직접 만든 예제나 혹은 다른 사람들이 만든 예제를 본다면 res -> navigation 디렉터리에서 확인할 수 있다.어느 화면이 어디로 이동하는지, 어떤 데이터를 넘겨주는지 등의 내용이 내재되어있다.

 

2. NavigationHost

네비게이션을 보여줄 일종의 "틀" 이라고 생각하면 편하다. 이 틀안에 사용자가 보여주고 싶어하는 화면을 돌려가면서 보여주면 된다. navigation graph로 부터 destination(보여줄 화면)을 보여주는 빈 컨테이너다.

 

3.NavigationController

네비게이션Host에서 보여줘야 하는 화면이나 동작을 관리해주는 녀석이다. 하나의 NavigationHost에는 하나의 NavigationController만 가질 수 있다.

 

NavigationController 가 일종의 리모컨이라고 생각하자. NavigationHost는 화면만 보여주는 꺼져있는 브라운관 티비이고.우리는 리모컨으로 티비를 켜서 원하는 채널을 돌려서 보고싶은걸 본다. NavigationHost와 NavigationController도 비슷하다.

 

기술을 공부할때는 사용법도 중요하지만 어떤 생각과 의도로 기술을 만들었는지 늘 의문을 가져야 한다.구글의 공식문서를 보면 Navigation과 관련된 다양한 섹션이 존재하는데 이중 네비게이션의 원칙(개념)을 정리한 글을 이해하기 쉽게 정리해봤다.

출처 : https://developer.android.com/guide/navigation/principles

네비게이션의 원칙들
1.고정된 시작지점
모든 앱에는 첫번째 시작지점이 있다. 카카오톡을 예로 들자면 앱을 실행하면 우린 친구목록 화면을 보게된다. 그리고 각 탭별로 나의 채팅방 목록, 쇼핑, 더보기 등을 볼 수 있다.
앱을 제일 처음 실행했을때 친구목록에서 부터 시작하는 것은 결코 변해서는 안된다.
앱을 처음 설치해서 사용하거나 로그인을 하지 않은 경우 보통 한번의 로그인을 하게 되는데 이런 경우를 시작지점으로 생각해서는 안된다! 사용자 입장에서는 매번 겪는 상황도 아니고 어쩌다 한번 보는 케이스이기 때문이다.
 
 
2.네비게이션의 상태값은 목적지의 스택으로서 표현된다.
공식문서의 원문 문장이다. "Navigation state is represented as a stack of destinations"
네비게이션이 동작하는 방식은 기본적으로 스택 구조다. 새로운 목적지(새로 보여질 화면)를 가게되면 스택의 가장 위에 새로운 화면이 추가된다.
그리고 뒤로가기를 누르거나 좌측상단의 <- 버튼을 누르면 스택의 가장 위에 있던 화면이 사라진다.
 
3.좌측상단의 <- 버튼과 화면 하단의 백버튼은 같은 동작을 수행한다.
둘 중 뭐든 하나를 누르면 화면 스택 최상단의 화면이 사라지고(이걸 보통 POP된다고 표현한다.) 이전의 목적지로 화면이 이동된다.
 
4.좌측상단의 <- 버튼은 앱의 처음 시작지점에 있어선 안된다.
사용자가 앱을 처음 실행하면 up버튼(좌측상단의 <- 버튼)은 없다. (사실 있는게 말이 안되지. 카톡 실행하면 친구목록에 그런 버튼이 있던가? 어디에도 없다.)
만약 앱이 다른 앱의 딥링크를 통해서 실행됐다면 업버튼을 클릭했을때 동작은 원래 앱이 딥링크를 실행한 앱이 아니라 딥링크를 통해 열린 앱에서 실행된다. 반면 백버튼(화면 하단의 뒤로가기)은 딥링크를 실행했던 앱으로 되돌아가게 한다.
 
5.Deep linking simulates manual navigation

 

다음에 이어서 공부하고 정리하는걸로하자.

 

 

예제 프로젝트 링크 주소https://github.com/YunSeokVV/TodayILearend/tree/feat/androidNavigation

 

GitHub - YunSeokVV/TodayILearend: 오늘 내가 공부한 것들을 정리하는 저장소

오늘 내가 공부한 것들을 정리하는 저장소. Contribute to YunSeokVV/TodayILearend development by creating an account on GitHub.

github.com

(들어가서 feat/navigation만 따로 골라서 봐야한다. 불편을 드려서 죄송합니다...)