Android

Jetpack navigation startDestination 동적으로 설정

최데브 2022. 8. 27. 12:39

팀 프로젝트를 하다가

기존에 로그인이 됐던 유저인지 처음 로그인 하는 유저인지

체크해서 로그인 화면으로 이동시킬지 자동으로 메인화면으로 이동하게 할지 체크하고 이동시켜주는

기능이 필요했다.

 

해당 프로젝트에서는 Jetpack navigation 을 사용하고 있었는데 위 동작을 정상적으로 보여주려면

startDestination 을 상황에 맞게 새로 설정해주는게 필요했다.

 

일단 해당 기능이 필요한 액티비티에서

    lateinit var navController  : NavController

네비게이션  동작을 컨트롤 해줄 NavController 을 선언해주자.

 

그리고 onCreate 에 

        val navHostFragment = supportFragmentManager.findFragmentById(R.id.join_nav_host) as NavHostFragment
        navController = navHostFragment.navController

이렇게 네비게이션으로 보여줄 화면이 나오는 fragment 뷰의 id인 join_nav_host 를 적어서 해당 뷰의 컨트롤러를 가져와

navController 으로 컨트롤 할 수 있게 적어준다.

* navHost 마다 자체 Navcontroller가 존재한다.

 

        <FrameLayout
            android:id="@+id/join_fl_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintEnd_toStartOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <fragment
                android:id="@+id/join_nav_host"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:defaultNavHost="true"
                app:navGraph="@navigation/join_nav_graph">
            </fragment>
        </FrameLayout>

view를 만들어줬다.

 

그리고 상황에 맞게 네비게이션 그래프를 설정해주는 함수도 만들어줬다.

    private fun setNavGraph(isAlreadyLogin: Boolean) {
        val navGraph = navController.navInflater.inflate(R.navigation.join_nav_graph)
        if (isAlreadyLogin) {
            val feedIntent = Intent(context, FeedActivity::class.java)
            startActivity(feedIntent)
        } else navGraph.setStartDestination(R.id.joinTypeFragment)
        navController.setGraph(navGraph, null) //navController에 graph 설정
    }

1. 컨트롤러에 어떤 네비게이션 graph 로 view를 이동시켜줄지 설정하고 

2. 이미 로그인 했던 유저인지 로그인하지 않았던 유저인지 boolean 변수로 받아오고

3. 해당 값에 따라서 메인화면으로 이동할지

4. 가입화면으로 이동할지 로직을 작성했다.

 

이렇게 사용하면 필요한 상황마다 처음으로 보여줄 화면이 달라져야할때

적절하게 사용할 수 있다.

반응형