Navigation component 시작하기
1. navi graph 만들기
navigation은 app의 destination(화면)간에 발생합니다.
즉, 사용자는 앱의 모든 위치에서 navigation 할 수 있다. destination(화면)은 작업을 통해 연결됩니다.
navi graph 는 모든 destination과 action 포함하는 리소스 xml파일입니다. 그래프는 앱의 모든 path를 나타냅니다.
1. Destinations 은 앱 내부 다양한 컨텐츠를 표현하는 Acticity/Fragment 이다.
2. Action 사용자가 취할 수 있는 경로를 나타내는 Destinations간의 논리적 연결입니다
2. NavHost를 Activity에 추가하기
navi component 의 핵심 부분 중 하나는 navi host 입니다.
navi host는 사용자가 앱을 탐색할 때 destination이 변경되는 빈 컨테이너입니다.
navi host는 NavHost에서 파생되어야 합니다.
NavHost 구현인 NavHostFragment는 fragment destination 변경을 처리합니다
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
android:name - NavHost 구현의 클래스 이름입니다.
app:navGraph - NavHostFragment를 navi graph와 연결한다.
app:defaultNavHost="true" - NavHostFragment는 system back button을 가로챕니다
* 하나의 NavHost만 default이 될 수 있습니다. 동일한 레이아웃에 여러 호스트가 있는 경우(예: 두 개의 창 레이아웃) 기본 NavHost를 하나만 지정해야 합니다.
3. navi graph에 destination 추가하기
기존 Fragment 또는 Activity에서 destination을 만들 수 있습니다.
navi editer 를 사용하여 새 대상을 만들거나 나중에 ragment 또는 Activity으로 대체할 자리 표시자를 만들 수도 있습니다.
4. destination 속성
Type - destination 소스 코드에서 fragment, activity 또는 user custom 클래스로 구현되는지 여부
Label - 사용자의 읽기 편의성을위한 destination 이름(toolbar 화면 이름으로 사용된다.)
* setupWithNavController()를 사용하여 NavGraph를 toolbar에 연결하는 경우, UI에 표시될수 있기에 이 값에 리소스 문자열을 사용하는 것이 좋습니다.
ID - 코드에서 대상을 참조하는 데 사용되는 destination ID입니다.
name(Class) - destination과 연결된 클래스의 이름이 표시됩니다.
이 드롭다운을 클릭하여 연결된 클래스를 다른 destination 유형으로 변경할 수 있습니다.
5. 시작 destination 지정하기.
시작 destination은 사용자가 앱을 열 때 보는 첫 번째 화면이고 사용자가 앱을 종료할 때 보는 마지막 화면입니다.
navi 편집기는 집 아이콘을 사용하여 시작 목적지를 나타냅니다.
6. destination 연결
action은 대상 간의 논리적 연결입니다. action은 navi graph에서 화살표로 표시됩니다.
action 일반적으로 한 destination을 다른 destination에 연결하지만 앱의 어디에서나 특정 destination으로 이동하는 전역 action을 만들 수도 있습니다.
action 통해 사용자가 앱을 통해 취할 수 있는 다양한 경로를 나타낸다, 실제로 destination로 이동하려면 탐색을 수행하는 코드를 작성해주면된다.
Type - “Action”
ID - 코드상 id
Destination - 도착하려는 destination
7. Navigate to a destination
destination탐색은 NavHost 내에서 앱 navi 을 관리하는 객체인 NavController를 사용하여 수행됩니다.
NavHost에는 해당하는 자체 NavController가 있습니다.
NavController를 검색방법
- Fragment.findNavController()
- View.findNavController()
- Activity.findNavController(viewId: Int)
FragmentContainerView를 사용하여 NavHostFragment를 생성하거나, FragmentTransaction을 통해 Activity에 NavHostFragment를 수동으로 추가하는 경우, Navigation.findNavController(Activity, @IdRes int)를 통해 Activity의 onCreate()에서 NavController를 검색하려는 시도는 실패합니다. 대신 NavHostFragment에서 직접 NavController를 검색해야 합니다.
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
class MainActivity : AppCompatActivity() {
private var _binding: ActivityMainBinding? = null
private val binding
get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 네비게이션 컨트롤러를 찾을수 없음
// val navController = findNavController(R.id.nav_host_fragment)
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
binding.button.setOnClickListener {
navController.navigate(R.id.action_firstFragment_to_secondFragment)
}
}
}
8. Safe Args를 사용하여 Type 안전 보장
Safe Args를 plugin 설치후 생성된 코드에는 정의한 각 Action에 대한 클래스(XXXFragmentDirection) 및 메서드와 각 전송 및 수신 Destination에 해당하는 클래스가 포함된다.
Safe Args는 Action 시작된 각 Destination에 대한 클래스를 생성합니다.
생성된 클래스 이름은 원래 Destination 클래스 이름에 "Direction"를 추가된다. (XXXFragmentDirection)
생성된 클래스에는 원래 Destination에 정의된 각 Action에 대한 static method가 포함되어 있습니다.
이 메서드는 Action에 필요한 매개변수를 인수로 사용하고 Navigation()에 전달할 수 있는 NavDirections 객체를 반환합니다.