본문 바로가기

TIL

TIL 65일차 - 최종프로젝트

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