1. 项目概述:从零开发Android计算器
作为一名有五年移动端开发经验的工程师,我经常被问到如何用Android Studio开发第一个实用APP。计算器项目看似简单,却是掌握Android开发核心技能的绝佳切入点。这个项目涵盖了UI设计、事件处理、数据计算等基础环节,特别适合刚学完Android基础想找练手项目的开发者。
我这次要分享的是一个支持加减乘除的基础计算器实现,重点不在于功能复杂度,而在于如何规范地组织代码结构。很多教程只关注功能实现,忽略了实际开发中的工程化细节。这个版本我会特别强调以下几点:
- 使用ConstraintLayout实现自适应布局
- 采用Model-View-Presenter模式分离业务逻辑
- 完整处理连续运算和运算符优先级
- 异常输入的健壮性处理
提示:本项目的完整源码已托管在GitHub(文末附链接),建议结合代码阅读本文效果更佳。开发环境使用Android Studio 2023.2.1 + JDK 17。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境与项目搭建
2.1 开发工具准备
工欲善其事必先利其器,我们先配置好开发环境:
- 下载最新版Android Studio(当前稳定版为Giraffe 2023.2.1)
- 安装时勾选Android SDK Platform 34和Android Emulator
- 建议使用Pixel 5模拟器(API 34)进行测试
注意:如果遇到"HAXM未安装"错误,需要到BIOS中开启VT-x虚拟化支持,然后在SDK Tools中单独安装Intel HAXM驱动。
2.2 新建工程关键配置
创建新项目时有几个关键选择:
- 模板选择Empty Activity
- 语言选择Java(虽然Kotlin是趋势,但Java更适合教学)
- Minimum SDK设为API 24(覆盖95%以上设备)
- 启用ViewBinding替代findViewById
我的build.gradle关键配置如下:
groovy复制android {
compileSdk 34
defaultConfig {
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
}
3. UI设计与布局实现
3.1 界面元素分解
一个标准计算器需要以下UI组件:
- 显示区域:TextView用于显示输入和结果
- 数字按钮:0-9和小数点
- 运算符按钮:+ - × ÷
- 功能按钮:清除(=)、退格(⌫)、等号(=)
3.2 ConstraintLayout布局实战
使用ConstraintLayout可以实现完美的响应式布局。关键技巧:
xml复制<TextView
android:id="@+id/tvDisplay"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<Button
android:id="@+id/btn7"
app:layout_constraintTop_toBottomOf="@id/tvDisplay"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn8"/>
布局参数说明:
- 边距使用8dp标准间距
- 按钮大小设为0dp(由ConstraintLayout计算)
- 权重使用chainStyle="spread"均匀分布
- 文本大小使用sp单位保证可访问性
3.3 样式与主题优化
在res/values/themes.xml中定义:
xml复制<style name="CalculatorButton" parent="Widget.Material3.Button">
<item name="android:textSize">24sp</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
</style>
<style name="DisplayText" parent="TextAppearance.Material3.DisplayMedium">
<item name="android:textSize">48sp</item>
<item name="android:gravity">end|center_vertical</item>
</style>
4. 计算逻辑实现
4.1 运算模型设计
采用MVC模式分离关注点:
- Model:Calculator.java处理核心计算逻辑
- View:MainActivity.java管理UI交互
- Controller:Presenter处理两者协调
Calculator类关键方法:
java复制public class Calculator {
private double operand1;
private double operand2;
private String operator;
public void setOperand(double value) {
if (operator == null) {
operand1 = value;
} else {
operand2 = value;
}
}
public double calculate() {
switch (operator) {
case "+": return operand1 + operand2;
case "-": return operand1 - operand2;
case "×": return operand1 * operand2;
case "÷":
if (operand2 == 0) throw new ArithmeticException();
return operand1 / operand2;
default: return operand1;
}
}
}
4.2 连续运算处理
实现连续计算需要维护运算状态:
- 用户输入第一个数字(operand1)
- 点击运算符时暂存operator
- 输入第二个数字(operand2)
- 点击等号时执行calculate()
- 结果显示后,结果作为新的operand1
4.3 异常情况处理
必须处理的边界情况:
- 除数为零时显示"Error"
- 连续点击运算符时更新运算符
- 退格键处理空输入
- 小数点重复输入检查
java复制public void handleBackspace() {
if (currentInput.isEmpty()) return;
currentInput = currentInput.substring(0, currentInput.length()-1);
if (currentInput.isEmpty()) {
display.setText("0");
} else {
display.setText(currentInput);
}
}
5. 功能扩展与优化
5.1 添加历史记录功能
扩展计算器显示计算历史:
- 在布局中添加RecyclerView
- 创建HistoryAdapter继承RecyclerView.Adapter
- 使用List
存储历史记录 - 每次计算完成后添加记录
5.2 实现横屏模式
创建res/layout-land/activity_main.xml:
- 双栏布局:左侧计算器,右侧历史记录
- 使用宽度百分比约束(app:layout_constraintWidth_percent)
- 添加横屏专属的mem+/-功能按钮
5.3 单元测试编写
在test/目录下创建CalculatorTest:
java复制@Test
public void testAddition() {
Calculator calc = new Calculator();
calc.setOperand(5);
calc.setOperator("+");
calc.setOperand(3);
assertEquals(8, calc.calculate(), 0.001);
}
@Test(expected = ArithmeticException.class)
public void testDivisionByZero() {
Calculator calc = new Calculator();
calc.setOperand(5);
calc.setOperator("÷");
calc.setOperand(0);
calc.calculate();
}
6. 常见问题与调试技巧
6.1 按钮点击无响应检查清单
- 检查ViewBinding是否正确初始化
- 确认setOnClickListener是否设置
- 查看布局文件中的android:clickable
- 检查是否有父视图拦截了点击事件
6.2 布局显示异常排查
- 使用Layout Inspector工具查看视图层次
- 检查ConstraintLayout的约束链是否完整
- 确认尺寸单位使用dp/sp而非px
- 测试不同屏幕密度下的表现
6.3 计算精度问题处理
金融计算需要改用BigDecimal:
java复制BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal sum = bd1.add(bd2); // 0.3
7. 项目源码解析
核心代码结构说明:
code复制app/
├── src/
│ ├── main/
│ │ ├── java/com/example/calculator/
│ │ │ ├── Calculator.java (模型)
│ │ │ ├── MainActivity.java (视图)
│ │ │ └── presenter/ (控制器)
│ │ └── res/
│ │ ├── layout/
│ │ ├── values/
│ │ └── layout-land/
│ └── test/ (单元测试)
关键实现技巧:
- 使用StringBuilder处理数字输入
- 运算符优先级通过栈结构实现
- 状态模式管理计算流程
- 使用LiveData观察数据变化
8. 项目进阶方向
完成基础版本后,可以考虑:
- 添加科学计算功能(三角函数、指数等)
- 实现主题切换(深色/浅色模式)
- 支持手势操作(滑动清除等)
- 添加语音输入功能
- 与后端服务集成(汇率换算等)
我在实际开发中发现,计算器项目虽然基础,但能全面锻炼Android开发能力。特别是对初学者来说,把这样一个完整项目做精做细,比做多个半成品项目收获更大。建议在实现基本功能后,尝试自己扩展一到两个进阶功能,这对理解Android系统设计理念很有帮助。
