jetpack Compose를 사용하는 Android 맞춤 대화상자
여러분, 안녕하세요! 👋 이 게시물에서는 제트팩 컴포즈를 사용하여 Android에서 사용자 지정 대화 상자를 만드는 방법을 설명합니다.
_
_
이 튜토리얼의 최종 출력 스크린샷은 아래 이미지와 같습니다.
이 사용자 지정 대화 상자를 빌드하는 동안 일부 재료 아이콘을 사용할 예정이므로 앱 수준 build.gradle 파일에 종속성을 아래에 배치해야 합니다.
implementation "androidx.compose.material:material-icons-extended:$compose_version"
1단계: 먼저 CustomDialog.kt라는 사용자 지정 대화 상자에 대한 별도의 파일을 생성합니다. 해당 파일에서 코드 아래에 배치합니다.
@Composable
fun CustomDialog(value: String, setShowDialog: (Boolean) -> Unit, setValue: (String) -> Unit) {
val txtFieldError = remember { mutableStateOf("") }
val txtField = remember { mutableStateOf(value) }
Dialog(onDismissRequest = { setShowDialog(false) }) {
Surface(
shape = RoundedCornerShape(16.dp),
color = Color.White
) {
Box(
contentAlignment = Alignment.Center
) {
Column(modifier = Modifier.padding(20.dp)) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "Set value",
style = TextStyle(
fontSize = 24.sp,
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Bold
)
)
Icon(
imageVector = Icons.Filled.Cancel,
contentDescription = "",
tint = colorResource(android.R.color.darker_gray),
modifier = Modifier
.width(30.dp)
.height(30.dp)
.clickable { setShowDialog(false) }
)
}
Spacer(modifier = Modifier.height(20.dp))
TextField(
modifier = Modifier
.fillMaxWidth()
.border(
BorderStroke(
width = 2.dp,
color = colorResource(id = if (txtFieldError.value.isEmpty()) android.R.color.holo_green_light else android.R.color.holo_red_dark)
),
shape = RoundedCornerShape(50)
),
colors = TextFieldDefaults.textFieldColors(
backgroundColor = Color.Transparent,
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent
),
leadingIcon = {
Icon(
imageVector = Icons.Filled.Money,
contentDescription = "",
tint = colorResource(android.R.color.holo_green_light),
modifier = Modifier
.width(20.dp)
.height(20.dp)
)
},
placeholder = { Text(text = "Enter value") },
value = txtField.value,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = {
txtField.value = it.take(10)
})
Spacer(modifier = Modifier.height(20.dp))
Box(modifier = Modifier.padding(40.dp, 0.dp, 40.dp, 0.dp)) {
Button(
onClick = {
if (txtField.value.isEmpty()) {
txtFieldError.value = "Field can not be empty"
return@Button
}
setValue(txtField.value)
setShowDialog(false)
},
shape = RoundedCornerShape(50.dp),
modifier = Modifier
.fillMaxWidth()
.height(50.dp)
) {
Text(text = "Done")
}
}
}
}
}
}
}
2단계: 이 단계에서는 시작 대화 상자에 하나의 버튼을 생성하고 해당 대화 상자에 사용자가 추가할 내용을 인쇄합니다. MainActivity.kt에 아래 코드를 붙여넣습니다.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
JetpackComposeDemoTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
HomePage()
}
}
}
}
}
@Composable
fun HomePage(){
val showDialog = remember { mutableStateOf(false) }
if(showDialog.value)
CustomDialog(value = "", setShowDialog = {
showDialog.value = it
}) {
Log.i("HomePage","HomePage : $it")
}
Scaffold(
topBar = {
TopAppBar(
title = {
Text(text = "Home")
}
)
}) {
Box(modifier = Modifier.background(Color.White)) {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(onClick = {
showDialog.value = true
}) {
Text(text = "Open Dialog")
}
}
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
JetpackComposeDemoTheme {
HomePage()
}
}
이제 jetpack Compose를 사용하여 사용자 지정 대화 상자가 완료되었습니다.
업데이트된 게시물을 받으려면 팔로우하고 좋아요를 눌러 동기를 부여하세요.
감사합니다 😊🙏
이 포스팅이 도움이 되셨다면 아래 좋아요 버튼을 몇번 눌러주세요!
Reference
이 문제에 관하여(jetpack Compose를 사용하는 Android 맞춤 대화상자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/manojbhadane/android-custom-dialog-using-jetpack-compose-455m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)