Compose - 함수 / UI 구성

2024. 7. 30. 18:22[개발]/Kotlin 활용 앱 개발

# Text

// 기본
@Composable
fun SimpleText() {
    Text("Hello World")
}

// strings.xml 활용
@Composable
fun StringResourceText() {
    Text(stringResource(R.string.hello_world))
}

 

// color
@Composable
fun BlueText() {
    Text("Hello World", color = Color.Blue)
}

// fontSize
@Composable
fun BigText() {
    Text("Hello World", fontSize = 30.sp)
}

// fontStyle
@Composable
fun ItalicText() {
    Text("Hello World", fontStyle = FontStyle.Italic)
}

// fontWeight
@Composable
fun BoldText() {
    Text("Hello World", fontWeight = FontWeight.Bold)
}

// fontFamily
@Composable
fun DifferentFonts() {
    Column {
        Text("Hello World", fontFamily = FontFamily.Serif)
        Text("Hello World", fontFamily = FontFamily.SansSerif)
    }
}

 

# TextField(=EditText)

// 기본
@Composable
fun SimpleFilledTextFieldSample() {
    var text by remember { mutableStateOf("Hello") }

    TextField(
        value = text,
        onValueChange = { 
		        text = it 
		    },
        label = { 
		        Text("Label") 
		    }
    )
}

 

# Image

// 이미지 로드
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description)
)
// 인터넷 이미지 로드
AsyncImage(
    model = "https://example.com/image.jpg",
    contentDescription = "Translated description of what the image contains"
)

 

# Scaffold

- topBar, bottomBar, floatingActionButton을 매개변수로 제공, 빠른 컴포넌트 구성을 지원

@Composable
fun ScaffoldExample() {
	  Scaffold(
        topBar = {
            TopAppBar(
                colors = topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Top app bar")
                }
            )
        },
        bottomBar = {
            BottomAppBar(
		            ...
            ) {
                Text(
                    modifier = Modifier
                        .fillMaxWidth(),
                    textAlign = TextAlign.Center,
                    text = "Bottom app bar",
                )
            }
        },
        floatingActionButton = {
            FloatingActionButton(
		            onClick = { 
										...
				        }
			      ) {
                Icon(...)
            
        }
        // Compose에서 기본으로 제공하는 padding값
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .padding(innerPadding),
        ) {
            Text(
                modifier = Modifier.padding(8.dp),
                text = ...
            )
        }
    }
}

 

# Button

@Composable
fun FilledButtonExample(onClick: () -> Unit) {
    Button(
        onClick = { 
            onClick() 
        }
    ) {
        Text("Filled")
    }
}

 

# Switch

@Composable
fun SwitchMinimalExample() {
    Switch(
    	// 체크 여부
        checked = checked,
        // checked가 바뀌면 하는 동작 
        onCheckedChange = {
            ...
        }
    )
}

 

# Checkbox

@Composable
fun CheckboxMinimalExample() {
    var checked by remember { mutableStateOf(true) }

    Row(
        verticalAlignment = Alignment.CenterVertically,
    ) {
        Text(
            "Minimal checkbox"
        )
        Checkbox(
            checked = checked,
            onCheckedChange = { 
		            checked = it 
		        },
        )
    }

    Text(
        if (checked) {
            "Checkbox is checked"
		    } else {
            "Checkbox is unchecked"
				}
    )
}

 

# List

- Column, Row를 따라 반복해서 Composable를 사용하여 UI를 표시할 수 있음

@Composable
fun MessageList(messages: List<Message>) {
    Column(...) {
        messages.forEach { message ->
            Text(message)
        }
    }
}

 

# LazyList

- 많은 수의 항목이나 길이를 알 수 없는 항목을 표시해야 하는 경우 모든 항목이 UI에 표시되어 성능 저하

- LazyColumn, LazyRow 등으로 문제 해결

LazyColumn {
    items(messages) { message ->
        MessageRow(message)
    }
}
LazyVerticalGrid(
    columns = GridCells.Adaptive(minSize = 128.dp)
) {
    items(photos) { photo ->
        PhotoItem(photo)
    }
}

 

# Resource

 

1) 기본

// strings.xml
<string name="compose">Jetpack Compose</string>

// compose
Text(
    text = stringResource(R.string.compose)
)

 

2) Formatting

// strings.xml
<string name="congratulate">Happy %1$s %2$d</string>

// compose
Text(
    text = stringResource(R.string.congratulate, "New Year", 2021)
)

 

3) Dimensions

// dimensions.xml
<dimen name="padding_small">8dp</dimen>

// compose
val smallPadding = dimensionResource(R.dimen.padding_small)
Text(
    text = "...",
    modifier = Modifier.padding(smallPadding)
)

 

4) Colors

// colors.xml
<color name="purple_200">#FFBB86FC</color>

// compose
HorizontalDivider(color = colorResource(R.color.purple_200))

 

(참고: https://developer.android.com/develop/ui/compose/components?hl=ko)

'[개발] > Kotlin 활용 앱 개발' 카테고리의 다른 글

데이터 저장 - Room  (0) 2024.07.31
데이터 저장 - SharePreferences  (0) 2024.07.31
Compose - 함수 / 레이아웃 구성  (0) 2024.07.30
Compose - 개념  (0) 2024.07.30
Android - ViewType(뷰타입)  (0) 2024.07.18