Jetpack Compose 기초 - 마무리
package com.android.composetest
// import ...
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ComposeTestTheme {
MyApp(modifier = Modifier.fillMaxSize())
}
}
}
}
@Composable
private fun Greeting(name: String, modifier: Modifier = Modifier) {
Card(
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.primary
),
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
CardContent(name)
}
}
@Composable
private fun CardContent(name: String) {
var expanded by rememberSaveable { mutableStateOf(false) }
Row(
modifier = Modifier
.padding(12.dp)
.animateContentSize(
animationSpec = spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
)
) {
Column(
modifier = Modifier
.weight(1f)
.padding(12.dp)
) {
Text(text = "보관함")
Text(
text = name, style = MaterialTheme.typography.headlineMedium.copy(
fontWeight = FontWeight.ExtraBold
)
)
if (expanded) {
Text(
text = (name +
" 번째 텍스트입니다. \n").repeat(4),
)
}
}
IconButton(onClick = { expanded = !expanded }) {
Icon(
imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
contentDescription = if (expanded) {
stringResource(R.string.show_less)
} else {
stringResource(R.string.show_more)
}
)
}
}
}
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = List(15) { "$it" }
) {
LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
items(items = names) { name ->
Greeting(name = name)
}
}
}
@Composable
fun OnboardingScreen(
onContinueClicked: () -> Unit,
modifier: Modifier = Modifier
) { Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Compose UI 테스트입니다.")
Button(
modifier = Modifier
.padding(vertical = 12.dp),
onClick = onContinueClicked
) {
Text("다음")
}
}
}
@Composable
fun MyApp(modifier: Modifier = Modifier) {
var shouldShowOnboarding by rememberSaveable { mutableStateOf(true) }
Surface(modifier, color = MaterialTheme.colorScheme.background) {
if (shouldShowOnboarding) {
OnboardingScreen(onContinueClicked = {shouldShowOnboarding = false})
} else {
Greetings()
}
}
}
@Preview(showBackground = true, widthDp = 320, heightDp = 320)
@Composable
fun OnboardingPreview() {
ComposeTestTheme {
OnboardingScreen(onContinueClicked = {})
}
}
@Preview(
showBackground = true,
widthDp = 320,
uiMode = UI_MODE_NIGHT_YES,
name = "GreetingPreviewDark"
)
@Preview(showBackground = true, widthDp = 320)
@Composable
fun GreetingPreview() {
ComposeTestTheme {
Greetings()
}
}
@Preview
@Composable
fun MyAppPreview() {
ComposeTestTheme {
MyApp(Modifier.fillMaxSize())
}
}
Jetpack Compose 공식 문서를 참고한 기초적인 Compose 코드이다.
@Preview를 사용해 Design을 확인할 수 있다.
Start Interactive Mode를 활용하면 onClick 등의 상태 변화를 확인할 수 있다.
LazyColumn을 사용하여 스크롤이 가능한 열을 표시할 수 있다. LazyColumn과 LazyRow는 Android 뷰의 RecyclerView와 동일한 역할을 수행한다.
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = List(15) { "$it" }
) {
LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
items(items = names) { name ->
Greeting(name = name)
}
}
}
rememberSaveable를 사용하여 구성 변경(앱 회전 등)이나 프로세스 중단에도 각 상태를 저장할 수 있다.
(remember 함수는 컴포저블이 컴포지션에 유지되는 동안에만 작동한다.)
@Composable
private fun CardContent(name: String) {
var expanded by rememberSaveable { mutableStateOf(false) }
ui.theme / Theme.kt에서 앱의 테마 등을 조절할 수 있다.
색상을 추가하는 방법은 theme와 마찬가지로 ui.theme / Color.kt에서 추가할 수 있다.
private val LightColorScheme = lightColorScheme(
surface = Blue,
onSurface = Color.White,
primary = LightBlue,
onPrimary = Navy
)
'TIL' 카테고리의 다른 글
TIL 67일차 - 최종프로젝트 (0) | 2024.06.25 |
---|---|
TIL 66일차 - 최종프로젝트 (0) | 2024.06.24 |
TIL 64일차 - 최종프로젝트 (0) | 2024.06.20 |
TIL 63일차 - 최종프로젝트 (0) | 2024.06.19 |
TIL 62일차 - 최종프로젝트 (0) | 2024.06.18 |