XML 布局 → Compose 声明式 UI

XML 布局 → Compose 声明式 UI

老写法(XML)

xml 复制代码
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题"
        android:textSize="18sp"
        android:textColor="#333333" />

    <Button
        android:id="@+id/btn_action"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginTop="8dp"
        android:text="点击" />
</LinearLayout>

Java 中绑定事件:

java 复制代码
TextView tvTitle = findViewById(R.id.tv_title);
tvTitle.setText("新标题");

Button btnAction = findViewById(R.id.btn_action);
btnAction.setOnClickListener(v -> {
    // 处理点击
});

问题在哪里

XML + Java 绑定是两套独立的东西:布局结构写在一处,行为逻辑写在另一处。找"这个按钮点了会干嘛"需要先查 XML 里的 ID,再去 Java 里搜 ID,中间容易断开。布局和代码之间靠字符串 ID 关联,没有编译期安全保障。

新写法(Compose)

kotlin 复制代码
@Composable
fun MyScreen() {
    var title by remember { mutableStateOf("标题") }

    Column(
        modifier = Modifier.padding(16.dp)
    ) {
        Text(
            text = title,
            fontSize = 18.sp,
            color = Color(0xFF333333)
        )

        Button(
            onClick = { title = "点击了" },
            modifier = Modifier
                    .fillMaxWidth()
                    .height(48.dp)
                    .padding(top = 8.dp)
        ) {
            Text("点击")
        }
    }
}

常用布局对应关系

XML Compose 备注
LinearLayout vertical Column 子项从上到下排列
LinearLayout horizontal Row 子项从左到右排列
FrameLayout Box 子项可以层叠,用 Modifier.align() 定位
ConstraintLayout Box + Modifier.align() 或 Compose 版 ConstraintLayout 简单层叠用 Box,复杂约束才用 Compose ConstraintLayout
RecyclerView LazyColumn / LazyRow 只渲染可见项,自带复用
ScrollView Column + Modifier.verticalScroll() 垂直滚动
Space / 空白 View Spacer(modifier = Modifier.height(8.dp)) 只占空间不渲染内容的占位

一句话注意

Compose 的 Modifier 顺序会影响最终效果。Modifier.padding(8.dp).background(Color.Red) 和 Modifier.background(Color.Red).padding(8.dp) 结果不一样------前者 padding 在外面不影响背景范围,后者背景撑满包含 padding 区域。这是 Compose 新人最容易踩的坑之一。

match_parent 在 Compose 里不是直接对应的概念------想撑满宽度用 Modifier.fillMaxWidth(),想撑满高度用 Modifier.fillMaxHeight(),想撑满父容器用 Modifier.fillMaxSize()。


Java Android 老项目迁移系列,持续更新中。

相关推荐
sunshine22 girl11 分钟前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat14 分钟前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
熊猫钓鱼>_>27 分钟前
Kotlin Multiplatform for OpenHarmony 实战:为 KMPNotifier 实现 OpenHarmony 本地通知引擎
kotlin·ai编程·harmonyos·鸿蒙·openharmony·适配·kmp
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
三少爷的鞋2 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
\光辉岁月/3 小时前
7.javase-面向对象
java·开发语言
weixin_531094693 小时前
heap_4内存管理
java·开发语言·算法
程序员南飞3 小时前
win系统安装minio
java·数据结构·算法
Escalating_xu4 小时前
【Python】使用库:标准库、第三方库、pip、项目实战与程序打包
java·python·pip
Wang's Blog4 小时前
Java框架 SpringCloud 快速入门: 过滤器链执行顺序
java·spring cloud