iOS 风格弹框组件集 (Compose版)

iOSStyleDialogs.kt

复制代码
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties

// 1. 基础确认对话框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSConfirmDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    confirmText: String = "确认",
    cancelText: String = "取消",
    confirmColor: Color = MaterialTheme.colorScheme.primary,
    cancelColor: Color = MaterialTheme.colorScheme.onSurface,
    onConfirm: () -> Unit,
    onCancel: () -> Unit = onDismiss
) {
    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容
                Text(
                    text = message,
                    style = MaterialTheme.typography.bodyMedium,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(24.dp)
                )

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                Row {
                    TextButton(
                        onClick = {
                            onCancel()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = cancelText,
                            color = cancelColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                    Divider(
                        color = Color.LightGray.copy(alpha = 0.3f),
                        modifier = Modifier
                            .width(1.dp)
                            .height(44.dp)
                    )
                    TextButton(
                        onClick = {
                            onConfirm()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = confirmText,
                            color = confirmColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                }
            }
        }
    }
}

// 2. 带输入框的对话框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSInputDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    confirmText: String = "确认",
    cancelText: String = "取消",
    confirmColor: Color = MaterialTheme.colorScheme.primary,
    cancelColor: Color = MaterialTheme.colorScheme.onSurface,
    initialValue: String = "",
    placeholder: String = "请输入",
    onConfirm: (String) -> Unit,
    onCancel: () -> Unit = onDismiss
) {
    var inputValue by remember { mutableStateOf(initialValue) }

    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容和输入框
                Column(
                    modifier = Modifier.padding(horizontal = 24.dp)
                ) {
                    Text(
                        text = message,
                        style = MaterialTheme.typography.bodyMedium,
                        textAlign = TextAlign.Center,
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(bottom = 12.dp)
                    )
                    OutlinedTextField(
                        value = inputValue,
                        onValueChange = { inputValue = it },
                        modifier = Modifier.fillMaxWidth(),
                        singleLine = true,
                        placeholder = { Text(placeholder) },
                        shape = RoundedCornerShape(8.dp)
                    )
                }

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                Row {
                    TextButton(
                        onClick = {
                            onCancel()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = cancelText,
                            color = cancelColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                    Divider(
                        color = Color.LightGray.copy(alpha = 0.3f),
                        modifier = Modifier
                            .width(1.dp)
                            .height(44.dp)
                    )
                    TextButton(
                        onClick = {
                            onConfirm(inputValue)
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = confirmText,
                            color = confirmColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                }
            }
        }
    }
}

// 3. 单按钮提示框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSInfoDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    buttonText: String = "确定",
    buttonColor: Color = MaterialTheme.colorScheme.primary,
    onConfirm: () -> Unit = onDismiss
) {
    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容
                Text(
                    text = message,
                    style = MaterialTheme.typography.bodyMedium,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(24.dp)
                )

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                TextButton(
                    onClick = {
                        onConfirm()
                        onDismiss()
                    },
                    modifier = Modifier.fillMaxWidth()
                ) {
                    Text(
                        text = buttonText,
                        color = buttonColor,
                        style = MaterialTheme.typography.labelLarge
                    )
                }
            }
        }
    }
}

// 预览
@Preview
@Composable
private fun PreviewDialogs() {
    MaterialTheme {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            // 预览确认对话框
            var showConfirm by remember { mutableStateOf(false) }
            Button(onClick = { showConfirm = true }) {
                Text("显示确认对话框")
            }
            if (showConfirm) {
                IOSConfirmDialog(
                    title = "删除确认",
                    message = "确定要删除这条数据吗?删除后不可恢复",
                    onDismiss = { showConfirm = false },
                    onConfirm = { /* 确认操作 */ }
                )
            }

            // 预览输入对话框
            var showInput by remember { mutableStateOf(false) }
            Button(onClick = { showInput = true }) {
                Text("显示输入对话框")
            }
            if (showInput) {
                IOSInputDialog(
                    title = "修改昵称",
                    message = "请输入新的昵称",
                    onDismiss = { showInput = false },
                    onConfirm = { input -> println("新昵称: $input") }
                )
            }

            // 预览提示对话框
            var showInfo by remember { mutableStateOf(false) }
            Button(onClick = { showInfo = true }) {
                Text("显示提示对话框")
            }
            if (showInfo) {
                IOSInfoDialog(
                    title = "操作成功",
                    message = "您的资料已提交审核",
                    onDismiss = { showInfo = false }
                )
            }
        }
    }
}
相关推荐
至乐活着4 天前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
le16161615 天前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le16161616 天前
Android Compose Modifier修饰符
android·compose·modifier
小书房16 天前
Android UI为什么由XML转向Compose
xml·ui·compose·声明式ui
le16161617 天前
Android Compose基础布局——从传统XML的视角切入了解
xml·compose
赏金术士22 天前
企业级 Jetpack Compose 项目(入门版)最佳结构
android·kotlin·compose
Jomurphys23 天前
Compose 调用 - 液态玻璃 Backdrop
android·compose
氦客1 个月前
Android Compose 图层的合成 : BlendMode
android·compose·jetpack·layer·blendmode·graphics·图层的合成
赏金术士1 个月前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
赏金术士1 个月前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose