본문 바로가기
Android/네비게이션

네비게이션이란 (1)

by 안스 인민군 2023. 8. 2.

기존에는 프레그먼트를 전환하기 위해 FragmentManager을 사용해왔다.

supportFragmentManager.beginTransaction()
replace(R.id.frame_layout, TestFragment())
commit()

그런데 구글에서는 JecPack이 도입된 후 FragmentManager을 사용하지 말고 Navigation을 사용하라고 권장하고 있다.

또한 Single Activity Architecture(SAA)를 제안하며 여러가지 문제가 있을 상황을 최대한 낮추고 가능하면 프레그먼트로 화면을 구성하라고 권장했다.

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)
}