안드로이드 뷰 기반의 앱에서는 XML 언어를 사용하여 레이아웃 파일을 정의한다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message"
style="@style/TextAppearance.AppCompat.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAlignment="center"
... />
<EditText
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:hint="@string/hint"
android:imeOptions="actionDone"
android:importantForAutofill="no"
android:inputType="textPersonName"
android:minEms="8"
... />
<Button
android:id="@+id/done"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/done"
... />
</androidx.constraintlayout.widget.ConstraintLayout>
→ 다음과 같은 XML 레이아웃 코드는 부모(root) 노드(ConstraintLayout)와 자식 노드(TextView, EditText, Button)의 계층 형태로 이루어지며,
View가 더 많아진다면 훨씬 더 중첩적인 구조를 가질 수 있다. (계층이 많아지는 ⇒ depth 가 높아짐)
Android View 시스템의 Activity에서는 일반적으로 (뷰 바인딩, 데이터 바인딩을 사용하지 않고)
setContentView()를 사용하여 레이아웃의 id 값을 전달한다.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
...
}
}
setContentView 메서드에 R.layout.main
id값을 전달한 코드이다.
private lateinit var doneButton : Button
...
doneButton = findViewById(R.id.done)
또한, 레이아웃 파일에 있는 View 컴포넌트를 호출하여 사용하기 위해서는
다음과 같이 findViewById()를 사용하여 View의 id 값을 받아와 정의해주어야 한다.
이와 같은 방식은 더 큰 규모의 앱과는 더욱 잘 맞지 않는다.
mutableStateOf()
를 사용하면 상태를 생성할 수 있다.@Composable
fun Factorial() {
var expanded by remember { mutableStateOf(false) }
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,
onDismissRequest = {
expanded = false
}) {
for (n in 0 until 10) {
DropdownMenuItem(onClick = {
expanded = false
text = factorialAsString(n)
}) {
Text("${n.toString()}!")
}
}
}
}
}