기존에는 프레그먼트를 전환하기 위해 FragmentManager을 사용해왔다.
supportFragmentManager.beginTransaction()
replace(R.id.frame_layout, TestFragment())
commit()
그런데 구글에서는 JecPack이 도입된 후 FragmentManager을 사용하지 말고 Navigation을 사용하라고 권장하고 있다.
또한 Single Activity Architecture(SAA)를 제안하며 여러가지 문제가 있을 상황을 최대한 낮추고 가능하면 프레그먼트로 화면을 구성하라고 권장했다.
결론은 화면은 최대한 프래그먼트로 전환하고 화면의 전환은 라이브러리에 맞기라는 뜻이다.
Navigation의 3대 컴포넌트
- Navigation graph
- Navigation host
- Navigation controller
Navigation graph
앱의 화면 구조를 시각적으로 표현한 그래프이다. 이 그래프는 액티비티와 프래그먼트 사이의 관계를 정의하고, 화면 간 전환 경로를 설정한다.
Navigation host
네비게이션 그래프를 호스팅하는 컨테이너 역할을 하는 액티비티나 프래그먼트이다. 이 호스트는 앱의 메인 화면으로 설정되고, 화면 전환과 프래그먼트 스택 관리를 담당한다.
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment" //뷰가 내부 호스트 프레그먼트에 연결
app:defaultNavHost="true" //시스템 내부에서 백버튼을 가로채 이전 화면으로 전환 가능함
app:navGraph="@navigation/mobile_navigation" //네비게이션 그래프 지정
/>
Navigation Controller
네비게이션 그래프를 기반으로 앱 내에서 화면 전환을 처리하는 객체이다. 네비게이션 컨트롤러는 프래그먼트 간 이동을 담당하며, 애니메이션 및 전환 효과를 지원한다.
// Fragment
val navController = findNavController()
// Activity
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
Safe Args를 사용하여 프래그먼트간 데이터 전달하기
기존에는 프레그먼트 사이에서 간단한 데이터를 전달할 때 key-value 타입의 Bundle을 사용했다.
하지만 bundle은 타입 안정성을 보장해주지 못하는 단점이 있었다.
Navigation 컴포넌트에서는 safe Args를도입하여 프레그먼트간 데이터를 전달한다.
- 내비게이션의 action 이 시작되는 대상의 이름에 Directions 라는 접미어가 붙은 클래스
- argument 를 전달하는데 사용한 action 의 이름과 동일한 이름의 클래스
- 데이터를 수신하는 대상의 이름에 Args 라는 접미어가 붙은 클래스
override fun onClick(v: View) {
val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
val amount = amountTv.text.toString().toInt()
val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
v.findNavController().navigate(action)
}
'Android > 네비게이션' 카테고리의 다른 글
네비게이션 실전편 (0) | 2023.08.07 |
---|---|
Single Activity Architecture(SAA)란? (0) | 2023.08.02 |
JeckPack 네비게이션이란 (2) - 실전 편 (0) | 2023.06.19 |
JeckPack 네비게이션이란 (1) - 이론 편 (0) | 2023.06.18 |