Compose๊ฐ ๋ญ๊น?
๋ป์ผ๋ก๋ ๊ตฌ์ฑํ๋ค, ์๊ณกํ๋ค ๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๋๋ฐ
์๋๋ก์ด๋์์๋ Compose๋
Jetpack Compose์ ํ ๊ฐ์ง๋ก ๋ค์ดํฐ๋ธ Android UI๋ฅผ ๋น๋ํ๊ธฐ ์ํ ์ต์ ๋๊ตฌ ํคํธ์ ๋๋ค.
๋งํฌ → https://developer.android.com/jetpack/compose/documentation
๊ธฐ์กด์ Android ์ XML๋ iOS ์ StoryBoard ๋ก ์์ฑํ๋ ๋ฐฉ์์ “ํน์ ์ํ์ ๋ฐ๋ผ UI๊ฐ ์ด๋ป๊ฒ ๋ณด์ฌ์ง์ง์ ๋ํด ๊ตฌํ” ํด์ผํ๋ค๋ฉด,
Jetpack Compose ๊ณผ ๊ฐ์ ์ ์ธํ UI๋ ์ด์ ๋ฐ๋๋ก “ํน์ ์ํ์ ๋ฐ๋ผ UI๊ฐ ๋ฌด์์ ๋ณด์ฌ์ฃผ๋ฉด ๋๋์ง์ ๋ํด ๊ตฌํ” ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ ๊ธฐ์กด UI ๊ตฌํ ๋ฐฉ์ ๋๋น ์ด์ ์
- ์ํ์ ๋ฐ๋ฅธ UI ๋ฅผ ์์ฑํ๊ธฐ ์ํด ํจ์ฌ ์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ทฐ ๊ณ์ธต์ ํธ๋ฆฌ๋ฅผ ํ์ (view.findViewById() ๋ฑ) ํ์ฌ ์๋์ผ๋ก ์กฐ์ํ๋ ๊ธฐ์กด์ ๋ฐฉ์๋ณด๋ค ์ค์ํ ํ๋ฅ ์ด ์ ๊ณ , ์ ์ง๋ณด์์ ์ธก๋ฉด์์ ์ข์ต๋๋ค.
- ๊ธฐ์กด ์ธ์ด์ ์ ์ฐ์ฑ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ๋ทฐ์ ์์ฑ ๋ฑ์ ๊ตฌํ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ธํ๊ฒ ์์ฑํ์ง ์์๋ ๋๋ฏ๋ก ์ฌ์ฌ์ฉ, ํ์ฅ์ฑ์ ์ฉ์ดํฉ๋๋ค.
์ผ๋จ ์ ๋ ์ด๋ค๊ฑด์ง ๋จผ์ ์จ๋ณด๊ณ ๊ทธ ๋ค์ ๋ ๊น๊ฒ ์์๋ณด๋ ์คํ์ผ์ด๋ผ ๋จผ์ ์จ๋ดค๋ค.
- ์ผ๋จ ์ต์ ๋ฒ์ ์ผ๋ก ์ฑ์ ๋ง๋ค ๋ Empty Compose Activity ํ์ผ๋ก ์ฑ์ ๋ง๋ ๋ค.
- ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ ์์ผ๋ก ์ฑ์ด ๋ง๋ค์ด ์ง ๊ฒ์ด๋ค.
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.Text
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text("Hello world!")
}
}
}
์์์ ๋ณด๋ฉด setContent ๋ผ๋ ํจ์๊ฐ ๋ณด์ผํ ๋ฐ ์ ์์์ Compose ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Text() ์์ String๊ฐ์ด ๋ค์ด๊ฐ์๋๋ฐ ์ ๋ ๊ฒ ์คํํ๊ฒ ๋๋ฉด ๋น ํ๋ฉด์
Hello world ๊ฐ ์ผ์ชฝ ์๋จ์ ์์น๋์ด์์ ๊ฒ์ด๋ค.
๊ธฐ์กด์ xml์ ์ฝ๋์ TextView๋ฅผ ๋ฐฐ์นํ๊ณ Activity์์ string ๊ฐ์ ์ง์ ํด์ฃผ๊ณ ๋์์ฃผ๋ ํ์์ด๋ ๋ค๋ฅด๊ฒ ์ ๋ ๊ฒ Text(”bla bla”) ๋ง ์ ์ด์ค๋ค๋ฉด text๋ฅผ ๋ณด์ฌ์ค ์์๋ค.
- ์ ๋ฐ์์ผ๋ก setContent ์์ ์์ฑํด๋ ๋์ง๋ง ํจ์๋ก ๋บ ์ ์๋๋ฐ ๊ทธ ๋ ์กฐ๊ฑด์ด ๋ฐ๋ฅธ๋ค.
// ...
import androidx.compose.runtime.Composable
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MessageCard("Android")
}
}
}
@Composable
fun MessageCard(name: String) {
Text(text = "Hello $name!")
}
์ ๊ธฐ MessageCard() ํจ์ ์์ ์ด๋ ธํ ์ด์ ์ด ๋ณด์ผํ ๋ฐ(@Compose) setContent ๋ฐ์์ Compose ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๊ธฐ ์ํด ์ ์ธํ ๊ฒ์ด๋ค.
3-1. ์ฌ๊ธฐ์ Compose์ ์ฅ์ ์ค ํ๋๋ ์ฝ๋๋ก ์์ ํ๋ฉด์ ๋ฐ๋ก ์๋ฎฌ๋ ์ดํฐ์์ ๋ณผ ์ ์๋ ์ฅ์ ์ด ์๋ค.
// ...
import androidx.compose.ui.tooling.preview.Preview
@Composable
fun MessageCard(name: String) {
Text(text = "Hello $name!")
}
@Preview
@Composable
fun PreviewMessageCard() {
MessageCard("Android")
}
@Preview ์ด๋ ธํ ์ด์ ์ ์ค์ ํด์ฃผ๋ฉด Android Studio ์ค๋ฅธ์ชฝ ์๋จ์ Split ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ทฐ๋ฅผ ๋ณด๋ฉด์ ์์ ์ด ๊ฐ๋ฅํ๋ค.
- ์ด์ Text() ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ๋!
// ...
import androidx.compose.foundation.layout.Column
@Composable
fun MessageCard(msg: Message) {
Column {
Text(text = msg.author)
Text(text = msg.body)
}
Row {
Text(text = msg.author)
Text(text = msg.body)
}
Box {
Text(text = msg.author)
}
}
Column {} ํจ์๋ก ๋ฌถ์ด์ฃผ๋ฉด ์์ง ์ ๋ ฌ, Row {} ๋ก ๋ฌถ์ด์ฃผ๋ฉด ์ํ์ ๋ ฌ, Box {}๋ก ๋ฌถ์ด์ฃผ๋ฉด ์์๋ฅผ ์์ ์ ์์ต๋๋ค.
Box {} ๋ ์์์ง๋ ์์๋ผ modifier๋ผ๋ ๋ณ์๋ฅผ ์ค์ ํด์ค์ผํ๋ค.
(์๋์์ ๋ฐ๋ก ์ค๋ช ํ๊ฒ ๋ค~)
- ์ด์ ๊ฐ UI์ margin, width, height ๋ฑ ์ค์ ์ ์ํด modifier๋ผ๋ ๊ฒ์ ์ค์ ํด์ค๋ค.
// ...
import androidx.compose.ui.Modifier
import androidx.compose.foundation.layout.width
@Composable
fun MessageCard(msg: Message) {
Column {
Text(text = msg.author)
Spacer(modifier = Modifier.height(4.dp))
Text(text = msg.body)
}
}
Spacer() ํจ์๋ UI์ ์ฌ์ด์ ๊ณต๊ฐ์ ๋ง๋ค์ด์ฃผ๋ UI๋ค.
๊ทธ ์์ modifier๋ฅผ Modifier.๋ณ์() ๋ฅผ ์ค์ ํด์ฃผ๋ฉด ์ฌ๋ฌ ์ค์ ์ ํ ์ ์๋ค.
- Text()์ ๊ธ์ ์์ด๋ ์ฌ์ด์ฆ ํน์ Style์ ์ง์ ํด์ค ์ ์๋ค.
@Composable
fun MessageCard(msg: Message) {
Row(modifier = Modifier.padding(all = 8.dp)) {
Column {
Text(
text = msg.author,
color = MaterialTheme.colors.secondaryVariant,
style = MaterialTheme.typography.subtitle2,
fontsize = 20.sp
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = msg.body,
style = MaterialTheme.typography.body2
)
}
}
}
Text() ๊ดํธ ์์ color, size, fontsize ๋ฑ๋ฑ ์ฌ๋ฌ ๋ณ์๋ค์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
Compose๋ ๊ณ์ํด์ ๊ณต๋ถ๋ฅผ ํด์ผํ๊ณ ๊ณ์ํด์ ์ ๋ฐ์ดํธ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ง์์ ์ผ๋ก ๋ธ๋ก๊ทธ๋ฅผ ์ฌ๋ฆด ์์ ์ด๋ค.
'Development > Compose' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Compose - Typegraphy๋ก TextStyle ์ผ๊ด ์ง์ (Feat. textSize๋ฅผ dp๋ก) (0) | 2023.06.09 |
---|---|
Jetpack Compose Camp 2022 ํ๊ธฐ (0) | 2023.04.05 |