UI를 XML 파일로 정의
UI를 런타임 단계에서 컴포넌트 트리로 인플레이트된다.
UI를 변경하려면 연관된 모든 컴포넌트의 속성을 수정해야만 한다.
UI 요소가 화면에서 보이지 않더라도 컴포넌트 트리의 요소로 남아있다.
이미지와 텍스트를 모두 보여주는 버튼을 만드는 케이스
@Composable
fun Factorial() {
var expanded by remember { mutableStateOf(false) } // 상태 값 -> Composable 함수에서 parameter로 사용되면 이 값이 변경될 때 마다 Recomposition이 발생한다.
var text by remember { mutableStateOf(factorialAsString(0)) } // 상태 값
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier.clickable {
expanded = true
},
text = text,
style = MaterialTheme.typography.h2
)
DropdownMenu(
expanded = expanded, // expanded 값에 따라 dropdown이 열리고 닫힌다.
onDismissRequest = {
expanded = false
}) {
for (n in 0 until 10) {
DropdownMenuItem(onClick = {
expanded = false
text = factorialAsString(n)
}) {
Text("${n.toString()}!")
}
}
}
}
}
@Composable
@Preview
fun ButtonDemo() {
Box {
Button(
onClick = { println("clicked") },
enabled = false
) {
Text(
"Click me!",
modifier = Modifier.clickable { // 개별 기능만 추가한 사례
println("text clicked")
}
)
}
}
}
컴포넌트 중심의 UI 프레임워크에서는 크기와 위치를 화면에 나타내는 프로퍼티가 핵심이다.
...Layout으로 이름이 끝나는 노드들은 자식 컴포넌트의 크기와 위치를 조정하는 능력을 갖는 컨테이너이다.
그래서 Compose는?
Row(), Column(), Box() 등을 사용하고, Modifier를 통해 위치 재정의를 한다.