반응형
[Android] 네비게이션(Navigation)에 대해 알아보자
# Navigation Component는 왜 등장 했을까?
기존 네비게이션 방식의 어려운 점들
- Fragment Transaction(Lifecycle Dancing)
- 상황마다 목적지가 다른 Up and Back Action
- Passing Arguments
- Deep Links
- 위의 문제들로 인한 *Error-prone Boilerplate Code
Error-prone : 발생하기 쉬운 오류
# 왜 Navigation Component를 쓸까?
- 우선 Navigation Component를 사용하면 여러 화면 (Fragment)를 하나의 Activity로 묶어서 그래프라는 개념으로 관리하게 된다.
(Single Activity - Multi Fragment) - Fragment의 전환을 직접 Fragment Manager를 통해 해줘야 했지만, Navigation을 사용하면서 FragmentManager를 통한 화면 전환을 직접 할 필요가 없다.
Up & Back에 대한 액션을 네비게이션 컴포넌트에게 위임한다. - 기본적으로 navigate() 메소드를 통해 화면 전환을 하게 되는데 popUpTo 옵션을 사용하여 특정 위치까지 되돌아갈 수 있고 popUpToInclusive 옵션을 통해 목적지 사이에 있는 프래그먼트를 날릴 수도 있다.
- SharedElement Animation도 지원한다. 화면 전환이 매우 smooth하게 이루어지는 것.
- SafeArgs를 사용하면 자동으로 생성된 코드 클래스를 통해 인자 전달 및 목적지 이동을 안전하게 할 수 있다.
- LifecycleOwner로 Fragment를 사용하면 메모리 누수가 발생할 수 있다.
LifecycleOwner로 ViewLifecycleOwner를 사용하면 된다. - 다음 목적지 인자 전달에는 Bundle || SafeArgs가 가능하지만, 이전 목적지로 돌아가게 되면 인자 전달 기능은 없다.
이는 AAC ViewModel을 사용하여 Activity Scope내에서 인자 전달이 가능하다. - NavController.navigate()를 빠르게 2번 호출하면 illegalStateException이 발생한다.
graph.xml내의 fragment에 종속된 Action을 Global Action으로 바꾸면 해결 된다.
이 경우, Fragment가 2개 생성되는데 이를 RxJava의 debounce 연산자로 중복 이벤트를 방지할 수 있다.
# 장점
- 프래그먼트의 트렌젝션 처리.
- 올바르게 Up과 Back동작을 처리.
- 화면전환에 대한 표준화된 애니메이션 리소스.
- 딥 링크 구현 및 처리를 쉽게 할 수 있다.
- Bottom Navigation과 같은 요소들을 최소한의 추가작업으로 구현.
- Safe Args - 대상사이에서 데이터를 탐색하고 전달할때 안정성을 제공하는 Graph 플러그인.
- ViewModel - Navigation Graph에 대한 ViewModel을 확인해 그래프 대상 사이에 UI 관련 데이터를 공유.
# Navigation 구성요소
- Navigation Graph : 모든 Navigation 관련 정보가 하나의 중심 위치에 모여있는 XML 리소스 입니다.
단순히 말해 사용자가 앱에서 갈 수 있는 모든 플로우를 보여주고 앱 내의 Fragment를 한눈에 확인 할 수 있습니다. - NavHost : Navigation Graph에서 대상을 표시하는 빈 컨테이너 입니다.
대상 구성요소에는 프래그먼트 대상을 표시하는 기본 NavHost구현인 NavHostFragment가 포함 됩니다. - NavController : NavHost에서 App Navigation을 관리하는 객체입니다. NavController는 사용자가 앱 내에서 이동할 때 NavHost에서 대상 콘텐츠의 전환을 조종하는 역할을 합니다.
Navigation Graph에서 특정 경로를 따라 이동할지, 특정 대상으로 직접 이동할지 NavController에게 전달하고 NavController가 NavHost에 적절한 대상을 표시해주는 방식입니다.
반응형
'안드로이드' 카테고리의 다른 글
[Android] 문자 보내기 (SEND_SMS) (0) | 2022.10.20 |
---|---|
[Android] 녹음 기능 RecMic to Mp3 (0) | 2022.10.20 |
Stack vs Heap (0) | 2022.09.20 |
TextView Ellipsize end가 OS낮은 버전에서 많이 줄여질 때 (0) | 2022.09.20 |
[Kotlin] inline함수 reified키워드 (0) | 2022.08.30 |