화면에 따라 Toolbar와 BottomNavigationView 를 show/hide하시면 됩니다.
Navigation Component UI관련 가이드는 개발자 문서에 나와 있습니다. https://developer.android.com/guide/navigation/navigation-ui
아래 섹션에 Toolbar와 BottomNavigationView를 제어하는 방법들이 나옵니다.
https://developer.android.com/guide/navigation/navigation-ui#listen_for_navigation_events
예제처럼, 바로 액티비티에 코딩을 할 수도 있지만, 다른 경우와 같이 구체적인 구현의 디테일을 감추는 것은 추후의 변경사항이나 유지보수시에 더 좋습니다. 따라서, 개인적인 권장사항은 Navigation Component를 감싸서 네비게이션 로직을 관리하는 중앙 클래스를 하나 만들어 사용하라는 것입니다. 이렇게 해야 네비게이팅시 사용자 로그인같은 상태를 체크해서 처리할 때 한군데서 통제를 할 수 있기 때문에 훨씬 좋습니다. 간단하게 예를 들면,
sealed class NavUiState (
val isToolbarVisible: Boolean,
val isBottombarVisible: Boolean
) {
object ToolbarBottombar: NavUiState(true, true)
object NoToolbarBottombar: NavUiState(false, true)
object NoToolbarNoBottombar: NavUiState(false, false)
}
sealed class NavDestination(
val navigationUiState: NavUiState,
val navId: Int,
val navArgs: Bundle? = null
) {
object Login: NavDestination(...)
object Onboarding: NavDestination(...)
object Home: NavDestination(...)
}
class NavManager(
private val navController: NavController
private val userManager: UserManager
) {
fun goTo(destination: NavDestination) {
when (userManager.userState) {
LOGGED_OUT,
NEVER_LOGGED_IN -> goToLogin()
ONBOARDING -> goToOnboarding()
else -> navController.navigate(navId, navArgs)
}
}
fun goToLogin() {
goTo(Login)
}
fun goToOnboarding() {
goTo(Onboarding)
}
fun goHome() {
goTo(Home)
}
}
이런 식으로 어떤 라이브러리를 사용하더라도 변경이 용이하도록 앱쪽에 라이브러리 자체를 직접 노출시키지 않는 것이 좋은 구조입니다.