마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Navigation 사용시 특정화면만 Container 말고 전체화면으로띄우기

0 추천

바텀 내비게이션을 사용하고 잇구요.

사진을 보시다시피 프래그먼트는 메뉴 위 라인까지 화면이 나오게 구성하고 있습니다.

그런데 제가 특정 버튼을 누르면 Navigation을 사용해서 다른 프래그먼트로 이동을 하고싶은데,

당연한거지만 이 화면이 FragmentContainer 영역에만 나온다는 겁니다.

저는 Navigation과 nav_graph를 사용하면서 가득찬 프래그먼트를 띄우고싶은데요,

nav_graph를 사용하면 대부분의 화면은 Fragment Container에서만 화면 전환이 이루어 질건데,

특정화면만 전체화면으로 띄우고싶어요..

어떻게 방법이 없을까요?

 

 

codeslave (3,940 포인트) 님이 2021년 12월 28일 질문
codeslave님이 2021년 12월 28일 수정

1개의 답변

0 추천

화면에 따라 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)
     }
}

 

이런 식으로 어떤 라이브러리를 사용하더라도 변경이 용이하도록 앱쪽에 라이브러리 자체를 직접 노출시키지 않는 것이 좋은 구조입니다.

spark (227,830 포인트) 님이 2021년 12월 28일 답변
감사합니다. 이번에 sealed 클래스 공부하면서 선생님이 적어주신 코드가 아~~주 약간 어떻게 되는지는 알겠는데 제 문제가.. 이걸 응용을 아직 못하겠네요.

예를들어서 선생님은 NavManager라는 sealed 클래스까지 만들어서 navArgs를 사용하신다면 저같은 경우는 그냥 findNavController.navigate().~~~하는거죠..

참 어렵네요 ㅋㅋ
핵심은 sealed class 사용이 아니고, 내가 만든 라이브러가 아닌 경우에는, 바로 노출 시켜 사용하기 보다는 내가 컨트롤 할 수 있는 클래스에 담아서 사용한다는 것입니다. 이번에 아마도 Log4J 이슈에 들어보셨을 거예요. 만약 이슈를 겪고있는 백엔드 코드가 Log4J를 바로 사용하지 않고 감싸서 사용했다면 이번과 같은 이슈가 나와서 코드를 변경해야 되는 경우가 생겼다면, 클래스 한군데만 손보면 되었을 텐데 Log4J를 바로 가져다 사용했다면 이럭 사용하고 있는 모든 클래스를 손대야하는 그런 사태가 발생할 수도 있는 거죠.
한꺼번에 많은 게 이해되거나 해결되지 않는다고 실망하지 마시고, 노력이 쌓이고 시간이 지나면 자연스럽게 수준이 올라가 계실 거예요. Clean Code, Code Complete, Refactoring 같은 많이 추천되는 책들을 읽어보시면 좋을 것 같아요. 이런 데서 중요한 스킬들을 많이 배우게 됩니다.
감사합니다. 선생님 clean code라는 책의 저자가 로버트 C. 마틴 맞나요?
책이 2013년 출간인거같은데, IT쪽 특성상 변화의 흐름이 빠른데 8년간의 차이가 없나요?
최신판을 구하시면 됩니다. 소프트웨어 엔지니어링에서 아주 핵심적인 사항들은 한참이 지나도 잘 변하지 않습니다. 이런 아키텍쳐나 공학 관련한 것도 마찬가지입니다. 시간이 지나도 골격은 동일하고 시대가 지남에 따라 업데이트 되어야 할 부분들은 새로운 에디션이 나옵니다.
이게 이런 책들을 읽어보시기를 권장하는 제일 큰 이유입니다. 앞으로 10년 후에도 거의 변하지 않을 것들을 배우는 거죠. 급변하는 기술들은 거의 대부분 이런 것들의 기반 위에서 나오는 거죠.
...