- Navigation 컴포넌트를 쓰면 여러화면(Fragment)을 하나의 Activity로 묶어서 그래프라는 개념으로 관리하게 된다. (1 Activity – N Fragments)
- Fragment의 전환을 직접 FragmentManager를 통해 해줘야했지만, Navigation을 쓰게 되면 FragmentManager를 통한 화면 전환을 직접 할 필요가 없다. Up 과 Back 에 대한 액션을 네비게이션 컴포넌트에게 위임하게 된다. (기본적으로 사용자 친화적으로 매우 잘 동작한다)
- 기본적으로 navigate()메소드를 통해 화면전환을 하게 되는데 popUpTo 옵션을 쓰면 특정 위치까지 되돌아 갈 수 있고 popUpToInclusive옵션을 통해 목적지사이에 있는 프레그먼트를 날릴 수도 있다.
- 예전엔 안되었지만 이제는 SharedElement 애니메이션도 지원한다.
- SafeArgs를 사용하면 자동으로 생성된 코드 클래스를 통해 인자 전달 및 목적지 이동을 안전하게 할 수 있다.
- LifecycleOwner로 Fragment를 사용하면 메모리 누수가 발생할 수 있다. LifecycleOwner로 ViewLifecycleOwner를 사용하는 것을 추천한다.
- 다음 목적지로 인자전달은 Bundle 또는 SafeArgs를 통해 할 수 있지만, 이전 목적지로 돌아가면서의 인자전달하는 기능은없다. 이를 해결하기위해 AAC ViewModel을 이용하여 Activity Scope내에서 인자전달이 가능하다. 물론 Dagger2를 통한 Activity Scope내의 오브젝트 그래프를 통한 인자 전달도 가능하다.
- 기본적으로 프레그먼트는 액티비티에서 동작하기 때문에 하나의 Window에서 여러 프레그먼트가 존재하는것인데, SystemUI(예: 전체화면모드;Immersive Mode)를 각각 다르게 가져가고 싶을 수 있다. 위와 마찬가지로 Activity Scope내에서 LiveData 또는 interface를 구현하여 시스템 UI를 변경하는 것을 추천한다.
- NavController.navigate()를 빠르게 2번 호출하면 IllegalStateException이 발생한다. graph.xml내의 fragment에 종속된 Action을 Global Action으로 바꾸면 해결된다. 이 경우 Fragment가 두개 생성된다. RxJava의 debounce 오퍼레이터를 이용하여 중복된 이벤트를 방지할 수도 있다.
카테고리: 미분류
1개의 댓글
miso · 2020년 12월 17일 11:30 오후
유의할 점 정리해주신 내용 잘보았습니다. 마지막 내용은 나중에 찾아봐야지 했는데…. 우연히 발견했네요 🙂
감사합니당 !