아래의 코드를 기반으로 만듦!
https://github.com/google-developer-training/basic-android-kotlin-compose-training-woof/tree/starter
implementation("androidx.compose.material:material-icons-extended")
IconButton 컴포저블 사용@Composable
private fun DogItemButton(
expanded: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
){
// 해당 아이콘을 클릭할 수 있게 만듦
IconButton(
onClick = onClick,
modifier = modifier
) {
Icon(
if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
contentDescription = stringResource(R.string.expand_button_content_description),
tint = MaterialTheme.colorScheme.secondary
)
}
}
DogItem()에 확장 상태를 저장하는 변수 추가var expanded by remember { mutableStateOf(false) }
DogItem() 컴포저블의 Row 블록 끝에 있는 DogInformation() 호출 뒤에 DogItemButton()을 추가DogItemButton(
expanded = expanded,
onClick = { /* TODO */ },
)
DogInformation()과DogItemButton() 사이에 아래의 코드 추가Spacer(modifier = Modifier.weight(1f))
아래와 같이 정렬

@Composable
fun DogHobby(
@StringRes dogHobby: Int,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier
) {
Text(
text = stringResource(R.string.about),
style = MaterialTheme.typography.labelSmall
)
Text(
text = stringResource(dogHobby),
style = MaterialTheme.typography.bodyLarge
)
}
}
Row 뒤에 DogHobby()를 Column의 두 번째 하위 요소로 추가DogHobby(
dog.hobbies, modifier = Modifier.padding(
start = dimensionResource(R.dimen.padding_medium),
top = dimensionResource(R.dimen.padding_small),
bottom = dimensionResource(R.dimen.padding_medium),
end = dimensionResource(R.dimen.padding_medium)
)
)
DogItem() 함수의 DogItemButton() 함수 호출에서 onClick() 람다 표현식을 정의DogItemButton(
expanded = expanded,
onClick = { expanded = !expanded },
)
DogBoddy() 함수 호출 부분을 if문으로 감싸기// 확장 상태일 때만 노출
if (expanded) {
DogHobby(
dog.hobbies, modifier = Modifier.padding(
start = dimensionResource(R.dimen.padding_medium),
top = dimensionResource(R.dimen.padding_small),
bottom = dimensionResource(R.dimen.padding_medium),
end = dimensionResource(R.dimen.padding_medium)
)
)
}
DogItemButton() 함수에서 expanded 상태에 따라 imageVector 값을 업데이트하는 if 문을 추가IconButton(
onClick = onClick,
modifier = modifier
) {
Icon(
// 추가
if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
contentDescription = stringResource(R.string.expand_button_content_description),
tint = MaterialTheme.colorScheme.secondary
)
}
DogItem()에서 Column 레이아웃에 modifier 매개변수를 추가animateContentSize를 추가해 크기(목록 항목 높이) 변경을 애니메이션 처리DampingRatioNoBouncy를 사용하여 스프링 애니메이션으로 설정되므로 반동력이 없음StiffnessMedium 매개변수는 스프링의 강성을 약간 더 높임Column(
modifier = Modifier
.animateContentSize(
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessMedium
)
)
)
https://github.com/MinchaeKwon/AndroidCompose/tree/master/Chapter3/Woof

위에서 연습한 것을 토대로 간단한 앱을 만들어 보았다!
https://github.com/MinchaeKwon/AndroidCompose/tree/master/Chapter3/Superheroes
