我之前一直觉得,计算器这种项目没什么技术含量,直到带过几个新手把完整的 Android Studio 项目跑起来之后,我才意识到:对刚接触 Android 开发的人来说,计算器恰恰是能把“界面布局 + 事件绑定 + 业务逻辑 + 源码组织”这条链路一次走完的最小项目。它不涉及网络请求、数据库这些容易分心的东西,知识点密度又足够高。这篇实战是基于 Android Studio 来做的简易版计算器,完整源码我会贴出来,每一段代码都会说明为什么这么写,遇到问题怎么排查。文章适合两类人:一是刚装好 Android Studio、想动手做第一个完整 App 的新手;二是以前跟着教程敲过代码,但没搞懂“按钮事件到底怎么流转”“浮点数为什么算不对”的初学者。
1. 环境准备:版本选型决定了你后面会不会踩坑
1.1 热词背后的版本对应关系(AGP、Gradle、JDK)
很多人被 “android studio hedgehog | 2023.1.1 patch 2 支持 agp8 版本吗” 这类问题卡住。这里有个基本概念需要先理清:Android Studio 是 IDE,AGP 是 Android Gradle 插件,两者不是绑定关系,但 IDE 版本对 AGP 有一个最低支持范围。Hedgehog 2023.1.1 对应的默认模板通常会创建 AGP 8.2 左右的项目,配套 Gradle 8.2+ 和 JDK 17。
这个版本对应关系非常关键,因为 AGP 8.x 之后发生了几个比较大的变化:
compileSdk、targetSdk、minSdk的配置方式更严格,targetSdk必须显式声明;- 原来的
package属性被namespace取代,新手很容易在这个地方报错; - AGP 8.x 默认要求 JDK 17,如果本机装了 JDK 8 或 JDK 11,同步 Gradle 时就会提示
Unsupported class file major version。
实际开发中我建议直接按官方推荐来:JDK 17 + AGP 8.2.x + Gradle 8.2 以上。这个组合在 Hedgehog 版本里跑得非常稳,不需要在网上找各种“兼容方案”。
1.2 创建项目时最容易忽略的配置细节
新建项目的时候,绝大多数教程会让选 “Empty Views Activity”,这个选择是对的。需要注意,现在 Android Studio 默认推荐的其实是 “Empty Activity”(基于 Compose),如果你选了这个,后面写布局文件的时候会遇到完全不同的思路。计算器这种小工具用传统的 View 体系更直观,XML 布局对新手也更友好,所以创建项目时一定要选模板名称里带 “Views” 的那个。
几个配置项的参考值:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Name | CalculatorApp | 应用显示名称 |
| Package name | com.example.calculator | 包名建议全小写,避免特殊字符 |
| Language | Java 或 Kotlin | 本文用 Java,便于老读者对照 |
| Minimum SDK | API 24 | 覆盖 Android 7.0 及以上设备,足够 |
| Build configuration language | Groovy DSL | 初学者别选 Kotlin DSL,资料更多 |
Minimum SDK 选择 API 24 的理由很简单:Android 7.0 以下的设备份额已经很低,没必要为了兼容老设备增加适配成本。计算器用到的 API 没有新特性依赖,所以这个选择完全够用。
1.3 虚拟设备失效的排查思路
热词里有一条 “为什么我的 android studio 的虚拟设备无效”,这几乎是每个新手都会遇到的事。AVD(Android Virtual Device)创建成功后,点启动却卡在启动界面、黑屏、或者直接报错退出,通常不是 Android Studio 坏了,而是下面几个原因:
- 系统镜像没装全:创建 AVD 时,如果选了 Google APIs 镜像,但没有下载对应的 System Image,启动时就会提示 fail。解决方法是打开 SDK Manager,在 SDK Platforms 里勾选对应 API Level 的 System Image。
- HAXM 或 Hyper-V 冲突:Windows 上 Intel CPU 需要安装 Intel HAXM,而 AMD CPU 需要依赖 Windows Hypervisor Platform(WHPX)。如果电脑开启过 Hyper-V,HAXM 会失效。这时候可以在控制面板里启用 “Windows Hypervisor Platform”,模拟器会自动走 WHPX,比卸载 Hyper-V 省事很多。
- AVD 的 ABI 与镜像不匹配:创建 AVD 时,ABI 选择
x86_64还是arm64,必须和已安装的 System Image 对应。这个不匹配往往在点击启动时才报错,排查起来很隐蔽。 - 显卡驱动问题:模拟器启动后白屏,多半是显卡渲染模式问题。可以在 AVD 的硬件配置里把 Graphics 改为
Software,虽然性能差一点,但能跑起来再说。
如果按上述顺序检查完仍然无效,还有一个笨但有效的办法:删掉 AVD 重新创建一个。很多情况下就是创建时某个参数和本机环境不匹配,重建一次,选默认配置,通常就好了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 界面布局:计算器 UI 设计的核心取舍
2.1 布局方案选型:GridLayout 还是嵌套 LinearLayout
计算器的界面结构非常规则:上面是显示区,下面是若干排按钮。这种场景有三种主流方案:
- 嵌套 LinearLayout:竖向 LinearLayout 里再放几条横向 LinearLayout,每条横放几个按钮。优点是简单直观,缺点是代码会有较多层级,修改按钮数量不太方便。
- GridLayout:Android 自带网格布局,直接设置
columnCount和rowCount,子元素按顺序填入格子。计算器按钮天然是网格结构,所以这是最优解。 - ConstraintLayout:功能强大,但写计算器需要给每个按钮相对其他按钮的约束,位置固定的场景反而繁琐。
我选 GridLayout,因为它最符合“按钮排布”的直觉。设置两行属性:
columnCount: 4,表示网格列数为 4;rowCount: 6,一行显示区 + 五行按钮(实际上显示区可以跨列,所以行数可以按需调整)。
这里有个容易忽略的细节:GridLayout 的子元素默认占据一个单元格,要让显示区横跨整行,需要给 TextView 设置 layout_columnSpan。按钮要均匀铺满每列,需要设置 layout_columnWeight 和 layout_rowWeight。网格布局里的 weight 和 LinearLayout 里的 weight 不太一样,它需要写完整包名:
xml复制app:layout_columnWeight="1"
app:layout_rowWeight="1"
也就是说,元素会按权重把多余空间分配到每个单元格,这样按钮无论屏幕多大都能均分。
2.2 按钮的尺寸、字体与状态反馈
计算器界面的体验细节主要集中在按钮尺寸、字体大小和点击反馈上。
按钮高度建议用 layout_height="0dp" 配合 layout_rowWeight="1",让 GridLayout 按行权重自动分配高度,而不是写死 60dp 或者 70dp。因为不同手机屏幕高度差异很大,写死尺寸在小屏手机上按钮会挤在一起,在大屏手机上又会显得稀疏。
字体方面,按钮文字用 24sp,显示区文字用 36sp 比较合适。这里的单位要注意:字体用 sp,尺寸用 dp。sp 会跟随系统字体缩放比例变化,dp 不会。如果按钮文字用了 dp,用户把系统字体调大后,文字不会随之变大,界面上可能出现文字互相遮挡的问题。
点击反馈默认的按钮状态变化在 Android 5.0 以后的 Material 主题下已经足够明显:按压会有水波纹效果。不需要额外设置背景选择器,除非你想要自定义颜色
