Xml์ด ์๋ Kotlin ๋ฌธ๋ฒ์ผ๋ก view๋ฅผ ์ ์.
View์ ๋์์ ์ํธ๊ด๊ณ, ์ํ ๊ด๋ฆฌ๋ฅผ ์งํํ ์ ์๋ API๋ฅผ ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํด์ค
๊ณ์ธต ๊ตฌ์กฐ๋ก ํํ์ด XML์ ๋นํด ๊ฐ๊ฒฐํ๋ค.
๋ฐ์ดํฐ๊ฐ ๋ฐ์ธ๋ฉ ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ทฐ๋ฅผ ์ง์ ์ฐพ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ง ์์๋ ๋๋ค.
์ ์ธํ UI ๋ฐฉ์์ผ๋ก ์์ํ๊ฒ UI ํํ์๋ง ์ง์คํ๊ธฐ ๋๋ฌธ์ ์ง๊ด์ .
์ปดํฌ์ฆ ํํ์ ์๋ ๋ฐ์ธ๋ฉ ๋์ด ๋ ์ด์ ๋ทฐ์ ์ํ๋ฅผ ์์์
์ผ๋ก ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
Navigation, ViewModel, Coroutine ๋ฑ ํ๋ ์์ํฌ ๋ ๋ฒจ์์ ์ ๊ทน์ ์ผ๋ก ์ง์ํ๋ค.
์ฝ๋์์ ๋์ ์ผ๋ก ๋ทฐ ๋ก์ง ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
MaterialDesign, Theme ๋ฑ ๋์์ธ ์ธก๋ฉด์์ ๊ฐํธํ API ๊ตฌ์กฐ์ ๋ค์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Animation API๊ฐ ๊ฐ๋ ฅํด์ก๋ค.
์ ์ธํ UI๋ ์ค๋ก์ง ๋ทฐ๊ฐ ์ด๋ค ์ํ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋์ง, ๋ทฐ์์ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง์๋ง ๊ด์ฌ์ด ์์
๊ฐ๋ฐ์๋ View์ State๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋๋ฐ ์ง์ค
@Composable
fun Gretting() {
val name by remember { mutableStateOf("Ethan") }
val count by remember { mutableStateOf(1) }
Column {
Text(text = "Name: $name")
Text(text = "Count: $count")
}
|
name, count๊ฐ ์ธ์ ์ด๋ป๊ฒ ๋ฐ๋๋์ง UI๋ ์ ํ ๊ด์ฌ ์๋ค.
๋ช ๋ นํ UI : name ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ฐ๋ฐ์๊ฐ setText๋ก ๋ทฐ์ text๋ฅผ ์ง์ ๋ฐ๊พผ๋ค.
์ ์ธํ UI : ํ ์คํธ์ name ์ํ๊ฐ ๋ฐ์ธ๋ฉ ๋์ด ์๋ค. name์ด ๋ฐ๋๋ฉด UI๊ฐ ์์์ ๋ฐ๊พผ๋ค.
ex) ๋ ๊ณ ์กฐ๊ฐ
ex) ๋ ๊ณ ์กฐ๊ฐ์ ์กฐ๋ฆฝํ๋ ๊ฒ์ ์ฐ์
xml์ TextView
xml๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ ์์ํฌ ์ฐจ์์์ ๋ฌธ์, ๋ฒํผ, ๋ ์ด์์ ๋ฑ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณต
xml์ Button
xml์ EditText
@Composable
fun Gretting() {
var name by remember { mutableStateOf("") }
TextField(
value = name,
onValueChange = { name = it }
)
}
xml์ LinearLayout(orientation = vertical)
@Composable
inline fun Column(
modifier: Modifier = Modifier,
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
content: @Composable ColumnScope.() -> Unit
) {
xml์ LinearLayout(orientation = horizontal)
@Composable
inline fun Row(
modifier: Modifier = Modifier,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top,
content: @Composable RowScope.() -> Unit
) {
xml์ FrameLayout
@Composable
inline fun Box(
modifier: Modifier = Modifier,
contentAlignment: Alignment = Alignment.TopStart,
propagateMinConstraints: Boolean = false,
content: @Composable BoxScope.() -> Unit
) {
์์ง ๋ฐฉํฅ ๋ฆฌ์คํธ๋ฅผ ์ํ ์ปดํฌ๋ํธ
๋ชจ๋ ๋ฆฌ์คํธ์ ๋ทฐ๋ฅผ ์์ฑํ์ง ์๊ณ ํ์ํ๋งํผ ๋ทฐ๋ฅผ ์์ฑ
LazyColumn {
val numbers = (0..100).toList()
items(numbers){
Text(
text = "Number: $it",
modifier = Modifier.height(200.dp)
)
}
}
์ปดํฌ๋ํธ๋ค์ ๊พธ๋ฏธ๋๋ฐ ์ฌ์ฉ๋๋ ์์ ์
@Composable
fun ModifierTest1(name: String){
Column(
modifier = Modifier
.size(300.dp)
.padding(24.dp)
.fillMaxSize()
.clickable { Log.d("TAG", "clicked!") }
){
Text(text = "Hello")
Text(text = ", $name")
}
}
Modifier๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จผ์ ํธ์ถ๋ ์ค์ ์ด ์ฐ์ ์ด๋ฏ๋ก padding์ ์ค์ ํ๊ณ Modifier์ clickable๋ณด๋ค ๋จผ์ ์์ฑํ๋ฉด padding ์ค์ ์ ์ฌ์ด์ฆ๋งํผ ํด๋ฆญ ์์ญ์ด ์ค์ ๋๋ค.