아니 나땐 말이야 … @Compose 이런거 없었다고 …
안드로이드를 공부하려고 하니 어마어마하게 바뀌었다.
뭐 컴포저블 … ?
겨우겨우 할 일을 나타내는 요소 하나를 만들었다.
@Composable
fun Todo(
todo: DSTodo,
onChange: (DSTodo) -> Unit,
) {
var vibrator = LocalContext.current.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
var name by remember { mutableStateOf(todo.name) }
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.background(Color.DarkGray)
) {
Button(
onClick = {
vibrator.vibrate(100)
onChange(todo.copy(isDone = !todo.isDone))
},
shape = RoundedCornerShape(0.dp),
contentPadding = PaddingValues(0.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Color.White,
contentColor = Color.Black,
),
modifier = Modifier
.background(Color.White)
.width(48.dp)
.height(48.dp)
.padding(0.dp),
) {
Image(
painter = if (todo.isDone) {
painterResource(id = R.drawable.dream_circle_normal_part1)
} else {
painterResource(id = R.drawable.dream_circle_empty_part)
},
contentDescription = null,
modifier = Modifier.size(24.dp)
)
}
BasicTextField(
singleLine = true,
value = name,
onValueChange = {
name = it
onChange(todo.copy(name = name))
},
textStyle = TextStyle(
background = Color.White,
),
modifier = Modifier.padding(0.dp)
)
}
}
이거 하나를 만들면서 배운 내용
첫번째, 옛날에 안드로이드 배울 당시에는, getContext() 함수를 쓰거나 context를 직접 전달받아서 사용했던 기억이 있다. 하지만, 지금은 LocalContext.current를 사용하면 쉽게 context를 가져와서 사용할 수 있었다.
두번째, 이미지는 svg 파일도 Vector Asset으로 추가하면 png 다음과 같이 추가할 수 있다.
Image(
painter = painterResource(id = R.drawable.dream_circle_normal_part1)
)
세번째, TextField 대신 BasicTextField를 쓴 이유는 버튼 자체의 크기가 정해져서 내 마음대로 조절하기 힘들기 때문이다.
네번째, 상태를 변경하는 경우, copy 함수를 사용해서 넣어주어야 한다.
onChange(todo.copy(name = name))