Compose 练习 - 选择 Yes

运行效果:

可以看到,点击 No 的时候,Yes 和 No 按钮会交换位置。点击 Yes 时,会弹出一个 Toast。

代码:

Kotlin 复制代码
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.kevintest.myapplication.ui.theme.MyApplicationTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MyApplicationTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    var order by remember { mutableStateOf(true) }
                    Choose(Modifier.padding(innerPadding), order = order, onYesClick = {
                        Toast.makeText(
                            this,
                            "Correct!",
                            Toast.LENGTH_SHORT
                        ).show()
                    }, onNoClick = {
                        order = !order
                    })
                }
            }
        }
    }
}

@Composable
private fun Choose(modifier: Modifier = Modifier, order: Boolean = true, onYesClick: () -> Unit = {}, onNoClick: () -> Unit = {}) {
    // Center alignment
    Column(
        modifier = modifier.fillMaxSize(),
        horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally,
        verticalArrangement = androidx.compose.foundation.layout.Arrangement.Center,
    ) {
        Text(modifier = Modifier.padding(22.dp), text = "6?", fontSize = 24.sp, color = Color.Black)
        Row {
            if (order) {
                YesButton(onYesClick)
                NoButton(onNoClick)
            } else {
                NoButton(onNoClick)
                YesButton(onYesClick)
            }
        }
    }
}

@Composable
private fun YesButton(onYesClick: () -> Unit) {
    Button(
        onClick = {
            onYesClick()
        },
        shape = RoundedCornerShape(22.dp),
        colors = ButtonDefaults.buttonColors(containerColor = Color.Unspecified),
        modifier = Modifier
            .size(160.dp, 80.dp)
            .padding(8.dp),
    ) {
        Text(modifier = Modifier, text = "Yes", fontSize = 18.sp, color = Color.White)
    }
}

@Composable
private fun NoButton(onNoClick: () -> Unit = {}) {
    Button(
        onClick = {
            onNoClick()
        },
        shape = RoundedCornerShape(22.dp),
        colors = ButtonDefaults.buttonColors(containerColor = Color.White),
        border = BorderStroke(2.dp, Color.Black),
        modifier = Modifier
            .size(160.dp, 80.dp)
            .padding(8.dp),
    ) {
        Text(modifier = Modifier, text = "No", fontSize = 18.sp, color = Color.Black)
    }
}

这里使用 Compose 设置了 UI 的样式。并且通过状态提升,将点击事件的回调,以及 order 变量都提到了上层。以保持 Composable 是无状态的。

相关推荐
4Forsee37 分钟前
【增强现实】快速上手 Vuforia Unity Android AR 应用开发
android·unity·ar
2501_944521591 小时前
Flutter for OpenHarmony 微动漫App实战:列表项组件实现
android·开发语言·javascript·flutter·ecmascript
小风呼呼吹儿1 小时前
Flutter 框架跨平台鸿蒙开发 - 种子发芽记录器:记录植物成长的每一刻
android·flutter·华为·harmonyos
一起养小猫1 小时前
Flutter for OpenHarmony 实战:Dart类与面向对象编程
android·flutter
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 多语言国际化实现
android·java·开发语言·javascript·flutter·游戏
2501_916007472 小时前
iOS APP 开发,从项目创建、证书与描述文件配置、安装测试和IPA 上传
android·ios·小程序·https·uni-app·iphone·webview
AC赳赳老秦2 小时前
Docker+DeepSeek:生成镜像优化Dockerfile与容器健康检查脚本
android·运维·人工智能·机器学习·docker·容器·deepseek
2501_944521592 小时前
Flutter for OpenHarmony 微动漫App实战:骨架屏加载实现
android·开发语言·javascript·数据库·redis·flutter·缓存
summerkissyou19872 小时前
Android13-蓝牙-常见问题
android·蓝牙
2501_944424124 小时前
Flutter for OpenHarmony游戏集合App实战之连连看路径连线
android·开发语言·前端·javascript·flutter·游戏·php