ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jetpack compose Navigation
    Android 2023. 5. 4. 11:51

     

    들어가기 전에

    Jetpack Compose 에서 Navigation 구현에 필요한 내용을 정리해보려고 한다.

     

    Navigation Compose

    Navigation 라이브러리 버전정보를 보려면 여기를 확인하자.

    // Jetpack Compose Integration
    implementation("androidx.navigation:navigation-compose:$navVersion")

     

    모듈 레벨에 build.gradle 파일의 선언하면 androidx.navigation.compose 라이브러리를 사용할 수 있게된다.

    화면 전환을 지원하는 객체는 rememberNavController() 사용해야한다.

     

    val navController = rememberNavController()
    
    NavHost(
        navController = navController,
        startDestination = "first",
    ) {
        composable("first") {
            FirstScreen(navController)
        }
        composable("second") {
            SecondScree(navController)
        }
        composable("third/{value}") { backStackEntry ->
            ThirdScreen(
                navController = navController,
    			value = backStackEntry.arguments?.getString("value") ?: "", // backStackEntry 에서 넘겨져오는 값을 얻을 수 있다
            )
        }
    }

     

    Compose 에서 제공하는 NavHost 메서드 파라미터 값으로, 변수로 선언해놓은 NavController 와 시작 지점을 작성한다.

     

    Coposable 어노테이션 함수로 작성할 첫번째 화면, 두번째 화면, 세번째 화면을 만들어준다.

    세번째 Composable 함수는 URL의 붙어오는 파라미터값이라고 생각하면된다.

     

    아래의 작성된 전체코드를 보면 navController.navigateUp() 함수는 탐색 계층 구조에서 사용자가 앱 UI의 위로 버튼을 누를 때와 같은 상황에 사용할 수 있다. 이 구성에서는 이전화면으로 돌아가는 것이다.

     

    navController.popBackStack() 함수는 컨트롤러의 백스택을 팝업한다. 사용자가 시스템 뒤로 버튼을 누를 때와 유사하다.

    navController.navigate() 함수는 여러 인자를 사용할 수 있지만 내가 사용한 방법은 *route 해주는 것이다.

     

    navController.navigate("third/$value") 는 세번째 화면으로 넘어갈 때 TextField 의 입력된 value 값을 넘기는 것이다.

     

    route: 출발지점과 목적지를 연결하는 길

     

    전체 코드

    package com.example.navigation
    
    import android.os.Bundle
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.compose.foundation.layout.Arrangement
    import androidx.compose.foundation.layout.Column
    import androidx.compose.foundation.layout.Spacer
    import androidx.compose.foundation.layout.fillMaxSize
    import androidx.compose.foundation.layout.height
    import androidx.compose.material3.Button
    import androidx.compose.material3.ExperimentalMaterial3Api
    import androidx.compose.material3.Text
    import androidx.compose.material3.TextField
    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.mutableStateOf
    import androidx.compose.runtime.remember
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.unit.dp
    import androidx.navigation.NavController
    import androidx.navigation.compose.NavHost
    import androidx.navigation.compose.composable
    import androidx.navigation.compose.rememberNavController
    
    @ExperimentalMaterial3Api
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                val navController = rememberNavController()
    
                NavHost(
                    navController = navController,
                    startDestination = "first",
                ) {
                    composable("first") {
                        FirstScreen(navController)
                    }
                    composable("second") {
                        SecondScree(navController)
                    }
                    composable("third/{value}") { backStackEntry ->
                        ThirdScreen(
                            navController = navController,
                            value = backStackEntry.arguments?.getString("value") ?: "", // backStackEntry 에서 넘겨져오는 값을 얻을 수 있다
                        )
                    }
                }
            }
        }
    }
    
    @ExperimentalMaterial3Api
    @Composable
    fun FirstScreen(navController: NavController) {
        val (value, setValue) = remember {
            mutableStateOf("")
        }
    
        Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            Text(text = "첫 화면.")
            Spacer(modifier = Modifier.height(16.dp))
            Button(onClick = {
                navController.navigate("second")
            }) {
                Text(text = "두 번째.")
            }
            Spacer(modifier = Modifier.height(16.dp))
            TextField(value = value, onValueChange = setValue)
            Button(onClick = {
                if (value.isNotEmpty()) {
                    navController.navigate("third/$value")
                }
            }) {
                Text(text = "세 번째.")
            }
        }
    }
    
    @Composable
    fun SecondScree(navController: NavController) {
        Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            Text(text = "두번째 화면.")
            Spacer(modifier = Modifier.height(16.dp))
            Button(onClick = {
                navController.navigateUp()
                /*navController.popBackStack()*/
            }) {
                Text(text = "뒤로 가기.")
            }
        }
    }
    
    @Composable
    fun ThirdScreen(navController: NavController, value: String) {
        Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            Text(text = "세 번째 화면.")
            Spacer(modifier = Modifier.height(16.dp))
            Text(text = value)
            Button(onClick = {
                navController.navigateUp()
            }) {
                Text(text = "뒤로 가기!")
            }
        }
    }

     

    완성된 화면

     

    'Android' 카테고리의 다른 글

    Jetpack compose 레이아웃 - ①  (0) 2023.05.09
    Jetpack compose State 심화  (0) 2023.05.08
    Jetpack compose Scaffold 와 Snackbar  (0) 2023.05.03
    Android Native App 개발 - ⑤  (0) 2023.04.25
    Android Native App 개발 - ④  (0) 2023.04.21
Designed by Tistory.