Jetpack Compose is Android modern toolkit for building native UI. It simplifies and accelerates UI development, replacing the traditional XML layout system with a declarative Kotlin API.
Why Jetpack Compose?
- Write UI in Kotlin — no more XML layouts
- Less code, more readable
- Live previews in Android Studio
- Built-in state management
- Better animations and transitions
Your First Composable
@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}
@Preview
@Composable
fun GreetingPreview() {
Greeting(name = "World")
}
State Management
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Count: $count",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { count++ }) {
Text("Increment")
}
OutlinedButton(
onClick = { count = 0 },
modifier = Modifier.padding(top = 8.dp)
) {
Text("Reset")
}
}
}
LazyColumn (RecyclerView replacement)
data class User(val id: Int, val name: String, val email: String)
@Composable
fun UserList(users: List) {
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(16.dp)
) {
items(users, key = { it.id }) { user ->
UserCard(user = user)
}
}
}
@Composable
fun UserCard(user: User) {
Card(
modifier = Modifier.fillMaxWidth(),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
CircleAvatar(name = user.name)
Spacer(modifier = Modifier.width(12.dp))
Column {
Text(user.name, style = MaterialTheme.typography.titleMedium)
Text(user.email, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant)
}
}
}
}
Navigation
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
composable("home") {
HomeScreen(
onUserClick = { userId ->
navController.navigate("user/$userId")
}
)
}
composable(
"user/{userId}",
arguments = listOf(navArgument("userId") { type = NavType.IntType })
) { backStackEntry ->
val userId = backStackEntry.arguments?.getInt("userId") ?: return@composable
UserDetailScreen(userId = userId)
}
}
}
🤖 Explain Compose code instantly
Paste any Jetpack Compose code into our AI Code Explainer for a detailed explanation with best practices.
Try AI Code Explainer →