๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ’ป/Nutri Capture

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - bottomBar ๋™์  ๋ณ€๊ฒฝ

interfacer_han 2024. 12. 18. 12:15

#1 ๊ฐœ์š”

#1-1 ์†Œํ”„ํŠธ์ฝ”๋”ฉ ๊ฐœ์š”

์ง€๊ธˆ๊นŒ์ง€๋Š” +๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, ํ˜„์žฌ ์‹œ๊ฐ์„ ๊ธฐ์ค€์œผ๋กœ (ํ•˜๋“œ์ฝ”๋”ฉ๋œ) ๋”๋ฏธ ์˜์–‘์†Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ DayMealView ๋ ˆ์ฝ”๋“œ๊ฐ€ INSERT๋˜์—ˆ๋‹ค. ์ด์ œ๋Š” View์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๊ฐ ๋ฐ ์˜์–‘ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œํ”„ํŠธ์ฝ”๋”ฉํ•˜์—ฌ ViewModel๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด๋ณธ๋‹ค.

 

#1-2 ์ฑ„ํŒ… UI๋ฅผ ์œ„ํ•œ '์ฑ„ํŒ…' ์ž…๋ ฅ ์ฐฝ

 

Nutri Capture ๋ฐฉํ–ฅ์„ฑ - ์ฑ„ํŒ… UI

#1 ๊ธฐ์กด UI ๋น„ํŒ#1-1 ์Šคํฌ๋ฆฐ์ƒท์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์Šคํฌ๋ฆฐ์ƒท์ด๋‹ค. ์•„๋ž˜๋Š” ์ด ํ™”๋ฉด์˜ ๋ฌธ์ œ์ ๋“ค์ด๋‹ค. #1-2 ์ค‘์ฒฉ๋œ Container'๋‚ ์งœ ์นด๋“œ' Container ์•ˆ์—๋Š” '์‹๋‹จ' Container๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํฌ์žฅ

kenel.tistory.com

์ด์ „์— ๊ณ„ํšํ•œ ๋ฐฉํ–ฅ๋Œ€๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค. ์ฑ„ํŒ… UI์ด๋ฏ€๋กœ ์˜์–‘ ๋ฐ์ดํ„ฐ๋ฅผ INSERTํ•˜๋Š” ๋ฐฉ์‹์€ ํ•˜๋‹จ์— ๊ณ ์ •๋˜์–ด์žˆ์„ '์ฑ„ํŒ…๋ฐ”'๋ฅผ ํ†ตํ•ด์„œ ์ด๋ค„์งˆ ๊ฒƒ์ด๋‹ค.

 

#1-3 ๊ธฐ์กด UI์™€์˜ ์ถฉ๋Œ

๋ฌธ์ œ๋Š” ์ด๋ฏธ ํ•˜๋‹จ์— NavigationBar๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ํ•˜๋‹จ ๋ฐ”๊ฐ€ 2๊ฐœ๋‚˜ ์žˆ์œผ๋ฉด ๋ณด๊ธฐ์—๋„ ์•ˆ ์ข‹์„ ๋ฟ๋”๋Ÿฌ, ๋ฌด์—‡๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋”ฐ์ง€์ž๋ฉด ํ•˜๋‹จ์— ๋” ์กด์žฌํ• ๋ฒ•ํ•œ ์˜ค๋ธŒ์ ํŠธ๋Š” '์ฑ„ํŒ…๋ฐ”'๋‹ค. NavigationBar๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋˜ ๊ธฐ๋Šฅ์€ ์•„๋งˆ TopAppBar()๋กœ ์˜ฎ๊ธธ ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๊ฒฐ์ •์€ ์ถ”ํ›„์— ๋ณ€๊ฒฝ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ ๊ธฐ์ค€์€ ์–ธ์ œ๋‚˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด๋‹ค.

 

#1-4 Scaffold์˜ bottomBar ๋ถ„๊ธฐํ™”

 

[Android] Jetpack Compose - Scaffold

#1 ๊ฐœ์š”#1-1 Scaffold์˜ ์‚ฌ์ „์  ์˜๋ฏธScaffold๋Š” ๋น„๊ณ„((๊ฑด์„ค) ๋†’์€ ๊ณณ์—์„œ ๊ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž„์‹œ๋กœ ์„ค์น˜ํ•œ ๊ฐ€์„ค๋ฌผ)๋ผ๋Š” ๋‹จ์–ด๋กœ ๋ฒˆ์—ญ๋œ๋‹ค. #1-2 Scaffold in Jetpack Compose Jetpack Compose  |  Android Developers์ด

kenel.tistory.com

NutrientScreen์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ BottomAppBar()๋ฅผ, ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ NavigationBar()๋ฅผ ์—ฌ์ „ํžˆ ํ‘œ์‹œํ•˜๊ฒŒ ๋‚˜๋ˆŒ ๊ฒƒ์ด๋‹ค.

 

#2 ์ฝ”๋“œ

#2-1 currentBackStackEntryAsState()

 

Compose๋ฅผ ์‚ฌ์šฉํ•œ ํƒ์ƒ‰  |  Jetpack Compose  |  Android Developers

์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Compose๋ฅผ ์‚ฌ์šฉํ•œ ํƒ์ƒ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. Navigation ๊ตฌ์„ฑ์š”์†Œ๋Š” Jetpack Compose

developer.android.com

๊ณต์‹ ๋ฌธ์„œ์—์„œ Compose์˜ ํ™”๋ฉด ์ „ํ™˜(Navigation)๊ณผ bottomBar๋ฅผ ์—ฐ๊ฒฐ์ง€์œผ๋ ค๋ฉด, "currentBackStackEntryAsState() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ"ํ•˜๋ผ๊ณ  ํ•œ๋‹ค (์ฐธ๊ณ : NavBackStackEntry). ์œ„ ๊ณต์‹ ๋งํฌ์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์—์„  ์ปดํฌ์ €๋ธ” BottomNavigation()์—์„œ currentBackStackEntryAsState()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋‚œ ํ•œ ๊ณ„์ธต ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€ Scaffold์—์„œ currentBackStackEntryAsState()๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

#2-2 Recomposition์„ ํ†ตํ•œ bottomBar ๋™์  ๋ณ€๊ฒฝ

// in MainActivity.kt

...

class MainActivity : ComponentActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        setContent {
            NutricapturenewTheme {
                // Navigation ๊ด€๋ฆฌ์˜ ์ฃผ์ฒด
                val navController = rememberNavController()
                val navBackStackEntry = navController.currentBackStackEntryAsState()
                val currentRoute = navBackStackEntry.value?.destination?.route

                ...

                Scaffold(
                    ...
                    bottomBar = {
                        when(currentRoute) {
                            Destination.NutrientScreen.route -> BottomAppBar { Text("test") }
                            else -> MainNavigationBar(navController)
                        }
                    },
                    ...
                ) { ... ->
                    ...
                }
            }
        }
    }

    @Composable
    private fun MainNavigationBar(navController: NavHostController) {
       ...
    }
}

...

ํ•ต์‹ฌ์€ currentBackStackEntryAsState()๋‹ค. ์™œ์ผ๊นŒ? ์ด๋ฆ„์—๋„ ๋‚˜์™€์žˆ์ง€๋งŒ, currentBackStackEntryAsState()๋Š” State๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. State๋Š” Recomposition์„ ์œ ๋ฐœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, State์ธ navBackStackEntry์—์„œ ํŒŒ์ƒ๋œ ๋ณ€์ˆ˜์ธ currentRoute ๋˜ํ•œ Recomposition์„ ์œ„ํ•œ '๊ฐ์‹œ ๋Œ€์ƒ'์ด ๋œ๋‹ค. ์ด๋Š” ์œ„ ์ฝ”๋“œ์— ์žˆ๋Š” when ๋ถ„๊ธฐ๋ฌธ์—์„œ๋„ ์ ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ, currentRoute๊ฐ€ State์™€ ์—ฐ์ด ์—†๋Š” ๋ณ€์ˆ˜์˜€๋‹ค๋ฉด ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋ถ„๊ธฐ๋ฌธ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค (์‹ค์ œ๋กœ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ๋ถ„๊ธฐ๋ฌธ์ด Activity์˜ ์ƒ์• ์ฃผ๊ธฐ์—์„œ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๊ณ  ์ดํ›„๋กœ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค).

 

#3 ์š”์•ฝ

Recomposition์„ ์ด์šฉํ•ด, Destination์— ๋”ฐ๋ผ bottomBar๊ฐ€ ๋™์  ํ• ๋‹น๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

 

#4 ์™„์„ฑ๋œ ์•ฑ

#4-1 ์Šคํฌ๋ฆฐ์ƒท

๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€๋ถ€ํ„ฐ "test" ๋ถ€๋ถ„์— ์ฑ„ํŒ…์ฐฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

#4-2 ์ด ๊ฒŒ์‹œ๊ธ€ ์‹œ์ ์˜ Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com

 

#4-3 ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ์ตœ์‹  Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com