Bỏ qua để đến nội dung

Giới thiệu Compose

Jetpack Compose là bộ toolkit UI hiện đại của Android, sử dụng Kotlin để xây dựng giao diện theo phong cách declarative.

Aspect XML Views Jetpack Compose
Cách viết Imperative Declarative
Ngôn ngữ XML + Kotlin/Java Pure Kotlin
State management Manual Automatic
Preview Layout Editor @Preview
Reusability Custom Views phức tạp Functions đơn giản
  • Ít code hơn: Viết ít hơn 50% so với XML
  • Declarative: Mô tả UI thay vì thao tác trực tiếp
  • Kotlin-first: Tận dụng sức mạnh của Kotlin
  • Reactive: UI tự động cập nhật khi state thay đổi
  • Tooling: Live preview, interactive preview
  • Interoperability: Tương thích với Views hiện có
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
buildFeatures {
compose = true
}
}
dependencies {
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.material3)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.ui.tooling.preview)
debugImplementation(libs.androidx.ui.tooling)
}
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}
  • Đánh dấu với @Composable
  • Function name viết PascalCase
  • Không return gì (emit UI)
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
}
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
Greeting("Preview")
}
// Multiple previews
@Preview(name = "Light", showBackground = true)
@Preview(name = "Dark", uiMode = UI_MODE_NIGHT_YES)
@Composable
fun Previews() {
MaterialTheme {
Greeting("Multi Preview")
}
}

Modifier thay đổi appearance và behavior:

@Composable
fun ModifiedText() {
Text(
text = "Hello Compose",
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.background(Color.LightGray)
.clickable { /* handle click */ }
)
}
// ❌ XML: Kế thừa CustomView
// class MyButton : AppCompatButton
// ✅ Compose: Composition
@Composable
fun PrimaryButton(
text: String,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
Button(
onClick = onClick,
modifier = modifier,
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary
)
) {
Text(text)
}
}

Khi state thay đổi, Compose chỉ recompose những phần bị ảnh hưởng:

@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Column {
Text("Count: $count") // Recompose khi count thay đổi
Button(onClick = { count++ }) {
Text("Increment") // Không recompose
}
}
}
// XML Views
textView.text = "Hello"
button.setOnClickListener {
textView.text = "Clicked"
}
// Compose
@Composable
fun MyScreen() {
var text by remember { mutableStateOf("Hello") }
Column {
Text(text)
Button(onClick = { text = "Clicked" }) {
Text("Click me")
}
}
}

  • Jetpack Compose là toolkit UI declarative
  • @Composable functions emit UI
  • Modifier thay đổi appearance/behavior
  • State drives UI (Unidirectional Data Flow)
  • Recomposition tự động khi state thay đổi
  • Pure Kotlin, không cần XML