기존의 액티비티 기반의 화면 구성이 아닌, 소수의 액티비티와 다수의 프래그먼트를 이용해 화면을 구성하는 구조를 뜻한다.
SAA를 사용함으로써 다음 화면을 두 가지 프레그먼트로 분리하여 구현할 수 있다.
navigation 모듈에는 별 다른 코드 없이 nav_graph.xml 파일 하나만 존재한다. 가장 하단에 navigation 모듈이 있고, 그것을 참조
하여 Fragment끼리의 이동을 시켜주는 것이다. Fragment의 이동이 필요한 모듈의 경우 Navigation 모듈을 참조하도록 하면 되는데, 보통 Navigation 모듈이 필요한 경우 Core 모듈도 높은 확률로 참조하고 있기 때문에 Core 모듈로 통합하여 사용해도 무관하다.
Fragmnet 상태를 저장하는 방법은 여러가지다.
여러가지 Configuration Change에 대응하기 위해 모든 상태를 ViewModel에 저장하는 것은 점점 Viewmodel을 커지게 한다.
Configuration Change 란?
일부 기기 구성에서 앱이 실행되는 동안 변경 될 수 있는 사항을 뜻한다.
- 앱 디스플레이 크기
- 화면 방향
- 글꼴 크기 및 두께
- 언어
- 테마 변경 (어두운 모드와 밝은 모드)
- 키보드 사용 가능 여부
- 멀티 윈도우 모드나 자유 형식 창에서 애플리케이션 크기 조절
Fragment 간 전환이 이루어질 때, replace
가 아닌 hide
와 show
로 잠깐 보이지 않게 하는 방법이다.
하지만 Navigation을 사용하면 기본 방식이 replace
기 때문에 사용이 불가능하다. 하지만 Navigation은 Fragment의 상태 저장을 내부적으로 도와준다.
Android에서 제공되는 모든 뷰에 구현되어 있는 함수다. onDestroyView
이전에 뷰의 상태가 저장되고, 복구되는 시점은 onViewCreated 이후인 뷰가 완전히 생성되었을 때이다.
참고한 포스팅에서는 네비게이션 바를 덮는 FragmentContainerView를 염두에 두고 BottomNavigation 처리를 고민하였지만, 이를 포괄적으로 특정 Fragmentf를 안 보이게 하는 방식으로 이해해 보았다.
Activity로 띄우는 거나, 화면 이동 후 직접적으로 이를 숨겨주는 navigate 메서드를 활용하는 방법도 있지만, 가장 효율적인 방법은 Navigation Component의 속성을 활용
하는 것이라고 한다.
// AppBar 설정
val appBarConfiguration = AppBarConfiguration(setOf(
R.id.map_fragment,
R.id.second_fragment,
R.id.third_fragment
))
navController.addOnDestinationChangedListener { _, destination, _ ->
binding.bottomNav.isVisible = appBarConfiguration.topLevelDestinations.contains(destination.id)
}
출처 :
1. https://velog.io/@iamjm29/Single-Activity-Architecture-SAA-%EC%A0%81%EC%9A%A9%EA%B8%B0
2. https://no-dev-nk.tistory.com/99
3. https://developer.android.com/guide/topics/resources/runtime-changes?hl=ko
4. https://heegs.tistory.com/128