[Kotlin / Compose] CheckBox, TopAppBar

Subeenยท2024๋…„ 4์›” 15์ผ
0

Compose

๋ชฉ๋ก ๋ณด๊ธฐ
5/20

Compose๋ฅผ ์‚ฌ์šฉํ•ด์„œ CheckBox ๋งŒ๋“ค๊ธฐ

โ˜๐Ÿป ๊ธฐ์กด์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ ˆ๊ฑฐ์‹œ ๋ทฐ์™€ Jetpack Compose์—์„œ Checkbox์˜ ๋‹ค๋ฅธ์ 
๊ธฐ์กด์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ ˆ๊ฑฐ์‹œ ๋ทฐ์—์„œ๋Š” ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํƒญํ•  ๋•Œ๋งˆ๋‹ค ์ฒดํฌ ์ƒํƒœ๊ฐ€ ํ† ๊ธ€ ๋˜์—ˆ๋‹ค.
Jetpack Compose์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•˜๋ฉฐ Checkbox์˜ ์ƒํƒœ๋Š” checked ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ œ์–ด๊ธฐ์— checked ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด Checkbox์˜ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š”๋‹ค.
๐Ÿ’ฅ Compose์—์„œ Checkbox์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” onCheckedChange ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ Checkbox์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Checkbox(checked = false, onCheckedChange = {})
  • checked : Checkbox ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, true์ด๋ฉด ์ฒดํฌ๋œ ์ƒํƒœ๋ฅผ, false์ด๋ฉด ์ฒดํฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • onCheckedChange : Checkbox์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ์ด ํ•จ์ˆ˜์—๋Š” ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ๋  ๋•Œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•  ์ž‘์—…์ด ํฌํ•จ๋œ๋‹ค.

๐Ÿ’ก ์ฒดํฌ๋ฐ•์Šค๊ฐ€ Ex1์€ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ , Ex2๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ด์œ 
Ex1์—์„œ๋Š” checked ๋ณ€์ˆ˜๋ฅผ ํ† ๊ธ€ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ Compose์—๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Checkbox์˜ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ณ  UI๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š”๋‹ค.
โ˜๐Ÿป Compose์—์„œ๋Š” UI ์ƒํƒœ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  Compose์—๊ฒŒ UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋„๋ก ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.
โœจ Compose์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ mutableStateOf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด Checkbox์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ด๋‹ค.

// Ex1 
@Composable
fun CheckBoxEx() {
	var checked = false
	Checkbox(checked = checked,
		onCheckedChange = {
		checked = !checked
	})
}
// Ex2
@Composable
fun CheckBoxEx() {
	var checked = remember {mutableStateOf(false)}
	Checkbox(checked = checked.value,
		onCheckedChange = {
		checked.value = !checked.value
	})
}
  • remember : Jetpack Compose์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, Composable ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜๊ณ  ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    • Composable ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ์žฌ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด์ „์— ์ €์žฅ๋œ ์ƒํƒœ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜๋ฏ€๋กœ UI๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค.
    • remember ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Composable ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

delegated properties

delegated properties๋Š” ํ”„๋กœํผํ‹ฐ์˜ getter์™€ setter๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” checked๋ณ€์ˆ˜์— ๋Œ€ํ•œ getter์™€ setter๋ฅผ remember ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์— ์œ„์ž„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, by ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ฐ์ฒด์— checked ๋ณ€์ˆ˜์˜ getter์™€ setter๋ฅผ ์œ„์ž„ํ•œ๋‹ค.

@Composable
fun CheckBoxEx() {
  var checked by remember { mutableStateOf(false) }
  Checkbox(checked = checked,
    onCheckedChange = {
    checked = !checked
  })
}

val (getter, setter) ๋ถ€๋ถ„์—์„œ ๋ฐ˜ํ™˜ ๋œ ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•˜์—ฌ getter์™€ setter๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.

@Composable
fun CheckBoxEx() {
  val (getter, setter) = remember { mutableStateOf(false) }
  Checkbox(
    checked = getter,
    onCheckedChange = setter
    )
}

Compose๋ฅผ ์‚ฌ์šฉํ•ด์„œ TopAppBar ๋งŒ๋“ค๊ธฐ

Jetpack Compose์—์„œ TopAppBar๋ฅผ ์„ ์–ธ ์‹œ ๋นจ๊ฐ„์ค„๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ์˜ ๋ฉ”์„ธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ๋‹ค.
์‹คํ—˜์šฉ foundation API๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ๊ณ ๋กœ @OptIn(ExperimentalMaterial3Api::class)๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋˜๋Š”๋ฐ, ์‹คํ—˜์šฉ foundation API๋Š” ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ๋ คํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

This material API is experimental and is likely to change or to be removed in the future.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopBarEx(name: String) {
    Column {
        TopAppBar(
            title = { Text(text = "TopAppBar") },
            navigationIcon = {
                IconButton(onClick = {}) {
                    Icon(
                        imageVector = Icons.Filled.ArrowBack,
                        contentDescription = ""
                    )
                }
            },
            actions = {
                IconButton(onClick = {}) {
                    Icon(
                        imageVector = Icons.Filled.Search,
                        contentDescription = "๊ฒ€์ƒ‰"
                    )
                }
                IconButton(onClick = {}) {
                    Icon(
                        imageVector = Icons.Filled.Settings,
                        contentDescription = "์„ค์ •"
                    )
                }
                IconButton(onClick = {}) {
                    Icon(
                        imageVector = Icons.Filled.AccountBox,
                        contentDescription = "๊ณ„์ •"
                    )
                }
            }
        )
        Text(text = "Hello $name!")
    }
}
  • TopAppBar : Material Design์˜ Top App Bar๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Composable๋กœ, ๋งจ ์œ„์— ์•ฑ์˜ ์ œ๋ชฉ์ด๋‚˜ ๋‹ค์–‘ํ•œ ์•ก์…˜์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” AppBar๋ฅผ ๋งŒ๋“ ๋‹ค.
    • title : AppBar์— ํ‘œ์‹œ๋  ์ œ๋ชฉ์„ ์„ค์ •ํ•œ๋‹ค.
    • navigationIcon : AppBar ์™ผ์ชฝ์— ํ‘œ์‹œ๋  ์•„์ด์ฝ˜์„ ์„ค์ •ํ•œ๋‹ค.
    • actions : AppBar ์˜ค๋ฅธ์ชฝ์— ํ‘œ์‹œ๋  ์•ก์…˜ ์•„์ด์ฝ˜๋“ค์„ ์„ค์ •ํ•œ๋‹ค.
  • IconButton : ๋ˆŒ๋ €์„ ๋•Œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ด์ฝ˜์„ ๋‚˜ํƒ€๋‚ด๋Š” Composable์ด๋‹ค.
    • onClick : ์•„์ด์ฝ˜์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ˆ˜ํ–‰๋  ๋™์ž‘์„ ์„ค์ •ํ•œ๋‹ค.
  • Icon : ์•„์ด์ฝ˜์„ ๋‚˜ํƒ€๋‚ด๋Š” Composable์ด๋‹ค.
    • ImageVector : ํ‘œ์‹œ๋  ์•„์ด์ฝ˜์„ ์„ค์ •ํ•œ๋‹ค.
    • contentDescription : ์•„์ด์ฝ˜์˜ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์„ค์ •ํ•œ๋‹ค.
profile
๊ฐœ๋ฐœ ๊ณต๋ถ€ ๊ธฐ๋ก ๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€