[Google Compose Camp] Jetpack Compose Unit 1/BirthdayCard

hyihyiยท2022๋…„ 12์›” 13์ผ
0

๐Ÿ“ขPreview() ํ•จ์ˆ˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ design ์ฐฝ์—์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ™”๋ฉด

๐Ÿ“ขsetContent ํ•จ์ˆ˜ ์•ˆ์ด ๋นŒ๋“œํ–ˆ์„ ๋•Œ ๋ณด์ด๋Š” ์‹ค์ œ ํ™”๋ฉด

Pathway2. Greeting Card ํ”„๋กœ์ ํŠธ

๐Ÿ“ข design ์ฐฝ์—์„œ ๊ธฐ๊ธฐ์˜ ์ „์ฒด ํ™”๋ฉด์„ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ

@Preview( showSystemUi = true)

onCreate( ) ํ•จ์ˆ˜

: ์ด ์•ฑ์˜ ์ง„์ž…์ ์ด๋ฉฐ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋นŒ๋“œํ•œ๋‹ค. Android ์•ฑ์—์„œ๋Š” onCreate( ) ํ•จ์ˆ˜๊ฐ€ main( ) ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

setContent( ) ํ•จ์ˆ˜

: onCreate( ) ํ•จ์ˆ˜ ์•ˆ์— ์žˆ์œผ๋ฉฐ ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. @Composable ์ฃผ์„์œผ๋กœ ํ‘œ์‹œ๋œ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” setContent( ) ํ•จ์ˆ˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์€ Jetpack Compose์—์„œ ์ด ํ•จ์ˆ˜๊ฐ€ UI๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  Kotlin ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  • ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐ
  • ํ•จ์ˆ˜ ์•ž์— @Composable ์ฃผ์„์„ ์ถ”๊ฐ€
  • @Composable ํ•จ์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.

DefaultPreview() ํ•จ์ˆ˜

๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋˜๋ ค๋ฉด @Preview ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ „์ฒด ์•ฑ์„ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์•ฑ์ด ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. @Preview ์ฃผ์„์€ showBackground๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  showBackground๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ๋ฐฐ๊ฒฝ์ด ์ถ”๊ฐ€๋œ๋‹ค.

Surface ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ

Surface๋Š” ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์ด๋‚˜ ํ…Œ๋‘๋ฆฌ์™€ ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” UI ์„น์…˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ํ…์ŠคํŠธ๋ฅผ ๋“œ๋ž˜๊ทธ ํ•œ ํ›„
  2. alt + Enter > Surround with widget > Surround with container ๋ฅผ ๋ˆ„๋ฅด๋ฉด Box ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.
    Box ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๊ณ  ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
Surface(color = Color.Blue) {
        Text(text = "Hello My name is $name!")
}

Modifier

modifier = Modifier.fillMaxSize() # ํ™”๋ฉด ์ „์ฒด ์ฑ„์šฐ๊ธฐ
modifier = Modifier.fillMaxHeight() # ๋†’์ด ์ „์ฒด ์ฑ„์šฐ๊ธฐ
modifier = Modifier.fillMaxHeight() # ๋†’์ด ์ „์ฒด ์ฑ„์šฐ๊ธฐ
modifier = Modifier.padding(24.dp)

๐Ÿ“ข Color ํ•จ์ˆ˜ ๋ถ€๋ถ„ ์—๋Ÿฌ๋‚  ๋•Œ

import androidx.compose.ui.graphics.Color

์„ importํ•˜๊ณ ๋„ ๋นจ๊ฐ„ ๋ฐ‘์ค„์ด ๋œฌ๋‹ค๋ฉด Color๋’ค์— ๋งˆ์นจํ‘œ๋ฅผ ๋ถ™์ด๊ณ  ์›ํ•˜๋Š” ์ƒ‰์ƒ์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

Pathway3-1. GreetingCard ํ”„๋กœ์ ํŠธ

Jetpack Compose

Jetpack Compose๋Š” Android UI๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ตœ์‹  ํˆดํ‚ท์ž…๋‹ˆ๋‹ค. Compose๋Š” ์ ์€ ์–‘์˜ ์ฝ”๋“œ, ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ๋ฐ ์ง๊ด€์ ์ธ Kotlin ๊ธฐ๋Šฅ์œผ๋กœ Android์—์„œ UI ๊ฐœ๋ฐœ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ๊ฐ€์†ํ•ฉ๋‹ˆ๋‹ค. Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ UI ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ํ•จ์ˆ˜, ์ฆ‰ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ผ๋Š” ํ•จ์ˆ˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•˜์—ฌ UI๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” Compose์—์„œ UI์˜ ๊ธฐ๋ณธ ๋นŒ๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.
๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” @Composable ์ฃผ์„์œผ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์—๋Š” ์ด ์ฃผ์„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • UI ์ผ๋ถ€๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช‡ ๊ฐœ์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ UI ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„

์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ @Composable ์ฃผ์„์„ ๋‹ฌ๊ณ  ์žˆ๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Compose ํ•จ์ˆ˜ ์ด๋ฆ„์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ช…์‚ฌ์—ฌ์•ผ ํ•จ: DoneButton()
๋™์‚ฌ ๋˜๋Š” ๋™์‚ฌ๊ตฌ์ด๋ฉด ์•ˆ ๋จ: DrawTextField()
๋ช…์‚ฌํ™”๋œ ์ „์น˜์‚ฌ์ด๋ฉด ์•ˆ ๋จ: TextFieldWithLink()
ํ˜•์šฉ์‚ฌ์ด๋ฉด ์•ˆ ๋จ: Bright()
๋ถ€์‚ฌ์ด๋ฉด ์•ˆ ๋จ: Outside()
๋ช…์‚ฌ ์•ž์—๋Š” ๋ช…์‚ฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ˜•์šฉ์‚ฌ๋ฅผ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ์Œ: RoundIcon()

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ฃผ์„

๋‹ค์Œ์€ @Preview ์ฃผ์„์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์˜ˆ


๋ฐฐ๊ฒฝ์„ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์ฃผ๋Š” ์ฃผ์„


๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ œ๋ชฉ์œผ๋กœ ์ฃผ์„ ๋‹ฌ๊ธฐ


๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ œ๋ชฉ ๋ฐ ์‹œ์Šคํ…œ UI(ํœด๋Œ€์ „ํ™” ํ™”๋ฉด)๋ฅผ ํฌํ•จํ•˜๋Š” ์ฃผ์„

Jetpack Compose์˜ ๋ฆฌ์†Œ์Šค

ํ•ญ์ƒ ํ”„๋กœ์ ํŠธ์˜ res/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŠน์ • ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๊ฐ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค๋Š” ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€ ํŒŒ์ผ๊ณผ ์ •์ ์ธ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„ํŠธ๋งต, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ฌธ์ž์—ด, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์นจ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Jetpack Compose๋Š” Android ํ”„๋กœ์ ํŠธ์— ์ •์˜๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ R ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค ID๋กœ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์™€ ๋ฌธ์ž์—ด ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ์œ ์ง€๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ญ์ƒ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Android๋Š” ๋Ÿฐํƒ€์ž„์— ํ˜„์žฌ ๊ตฌ์„ฑ์„ ๊ทผ๊ฑฐ๋กœ ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ UI ๋ ˆ์ด์•„์›ƒ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์–ธ์–ด ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

painterResource() ํ•จ์ˆ˜๋Š” ๋“œ๋กœ์–ด๋ธ” ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค ID(์ด ๊ฒฝ์šฐ R.drawable.androidparty)๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

painterResource() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ Image ์ปดํฌ์ €๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ  image๋ฅผ ์ด๋ฆ„์ด ์ง€์ •๋œ painter ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ข Image ํ•จ์ˆ˜ ๋ถ€๋ถ„ ์—๋Ÿฌ๋‚  ๋•Œ

import androidx.compose.foundation.Image

๊ณ„์† ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด contentDescription = null ์ถ”๊ฐ€

painterResource( ), ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค

painterResource() ํ•จ์ˆ˜๋Š” ๋“œ๋กœ์–ด๋ธ” ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค ID(์ด ๊ฒฝ์šฐ R.drawable.androidparty)๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

val image = painterResource(R.drawable.androidparty)
    Image(
        painter = image,
        contentDescription = null
    )

Box ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€

โŒ ??? ๊ฐ‘๋ถ„ ํŒจ๋”ฉ ??? โŒ
ํŒจ๋”ฉ์€ ์ˆ˜์ •์ž๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์ปดํฌ์ €๋ธ”์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ์ €๋ธ”์˜ ๊ฐ ๋ฉด์˜ ๊ฒฝ์šฐ padding ์ˆ˜์ •์ž๋Š” ํŒจ๋”ฉ ๊ฐ’์„ ์ •์˜ํ•˜๋Š” ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Column, Row ๋ฐ Box๋Š” ์ปดํฌ์ €๋ธ” ์ฝ˜ํ…์ธ ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ ˆ์ด์•„์›ƒ ์š”์†Œ ๋‚ด์— ํ•ญ๋ชฉ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Row ์ปดํฌ์ €๋ธ” ๋‚ด์˜ ๊ฐ ํ•˜์œ„ ์š”์†Œ๋Š” ํ•œ ํ–‰์— ๊ฐ€๋กœ๋กœ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜.

Text(
     text = from,
     fontSize = 24.sp,
     modifier = Modifier
          .fillMaxWidth()
          .wrapContentWidth(Alignment.End)
          .padding(start = 16.dp, end = 16.dp)
 )

-๋ฌธ์ž์—ด

ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์€ ์•ฑ ์ฝ”๋“œ์— ์ง์ ‘ ์ž‘์„ฑ๋œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ž์—ด๋กœ ์ธํ•ด ์•ฑ์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๊ณ  ์•ฑ์˜ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ๋ฌธ์ž์—ด์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ํž˜๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ๋ฌธ์ž์—ด์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ํŒŒ์ผ์— ๋„ฃ๊ณ  ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ ํ›„ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
1. ๋ฌธ์ž์—ด์„ ๋“œ๋ž˜๊ทธํ•œ ํ›„ ์ „๊ตฌ > Extract string resource
Resource name ์—๋Š” ์“ฐ์ผ ์ด๋ฆ„์„ ์ ๊ณ  Resource value์—๋Š” ์‹ค์ œ ๋ฌธ์ž์—ด ์ž…๋ ฅ
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์ด stringResource() ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด๋œ๋‹ค.

profile
์ž์œ ๋กญ๊ฒŒ ์“ด ๋‚˜์˜ ์ž์œ ๋กœ์šด Development voyageโ›ต

0๊ฐœ์˜ ๋Œ“๊ธ€