jetpack Compose를 사용하는 Android 맞춤 대화상자

여러분, 안녕하세요! 👋 이 게시물에서는 제트팩 컴포즈를 사용하여 Android에서 사용자 지정 대화 상자를 만드는 방법을 설명합니다.



_
  • 이 대화 상자를 만드는 동안 사용된 구성 —
  • 버전 작성: 1.1.0-alpha06
  • 코틀린 버전: 1.5.31
  • 안드로이드 스튜디오 : 안드로이드 스튜디오 범블비 | 2021.1.1 패치 3
    _

  • 이 튜토리얼의 최종 출력 스크린샷은 아래 이미지와 같습니다.



    이 사용자 지정 대화 상자를 빌드하는 동안 일부 재료 아이콘을 사용할 예정이므로 앱 수준 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를 사용하여 사용자 지정 대화 상자가 완료되었습니다.

    업데이트된 게시물을 받으려면 팔로우하고 좋아요를 눌러 동기를 부여하세요.
    감사합니다 😊🙏

    이 포스팅이 도움이 되셨다면 아래 좋아요 버튼을 몇번 눌러주세요!

    좋은 웹페이지 즐겨찾기