用 Android Studio 从零开发一个多功能计算器应用
简介
计算器是每个学习 Android 开发者必经的经典项目之一。本篇文章将带你创建一个功能更强大的计算器应用,支持基本的加减乘除运算、带小数点的输入以及更多操作符功能。通过这个项目,你将全面掌握 Android 的布局设计、事件处理和逻辑实现技巧。
一、功能设计
基础功能
- 支持基本运算:加、减、乘、除。
- 支持小数点输入:可以输入和计算小数。
- 实时显示结果:输入数字和符号后立即显示计算结果。
进阶功能
- 清除功能:重置当前计算状态。
- 百分比运算:支持百分比的简单操作。
- 正负号切换:支持正负数输入。
二、项目创建与布局设计
1. 创建新项目
- 打开 Android Studio,点击 New Project。
- 选择 Empty Activity 模板,命名项目为 AdvancedCalculator。
- 选择编程语言为 Java 或 Kotlin。
2. 布局设计
打开 res/layout/activity_main.xml
文件,设计用户界面。
完整布局代码:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 显示屏 -->
<TextView
android:id="@+id/tvDisplay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:padding="16dp"
android:text="0"
android:textSize="36sp"
android:background="#E0E0E0"
android:layout_marginBottom="16dp" />
<!-- 按钮区域 -->
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="4"
android:rowCount="5"
android:padding="8dp">
<!-- 第一行 -->
<Button android:id="@+id/btnClear" android:text="C" style="@style/CalcButton"/>
<Button android:id="@+id/btnSign" android:text="+/-" style="@style/CalcButton"/>
<Button android:id="@+id/btnPercent" android:text="%" style="@style/CalcButton"/>
<Button android:id="@+id/btnDivide" android:text="/" style="@style/CalcButton"/>
<!-- 第二行 -->
<Button android:id="@+id/btn7" android:text="7" style="@style/CalcButton"/>
<Button android:id="@+id/btn8" android:text="8" style="@style/CalcButton"/>
<Button android:id="@+id/btn9" android:text="9" style="@style/CalcButton"/>
<Button android:id="@+id/btnMultiply" android:text="×" style="@style/CalcButton"/>
<!-- 第三行 -->
<Button android:id="@+id/btn4" android:text="4" style="@style/CalcButton"/>
<Button android:id="@+id/btn5" android:text="5" style="@style/CalcButton"/>
<Button android:id="@+id/btn6" android:text="6" style="@style/CalcButton"/>
<Button android:id="@+id/btnSubtract" android:text="-" style="@style/CalcButton"/>
<!-- 第四行 -->
<Button android:id="@+id/btn1" android:text="1" style="@style/CalcButton"/>
<Button android:id="@+id/btn2" android:text="2" style="@style/CalcButton"/>
<Button android:id="@+id/btn3" android:text="3" style="@style/CalcButton"/>
<Button android:id="@+id/btnAdd" android:text="+" style="@style/CalcButton"/>
<!-- 第五行 -->
<Button android:id="@+id/btn0" android:text="0" style="@style/CalcButton" android:layout_columnSpan="2"/>
<Button android:id="@+id/btnDot" android:text="." style="@style/CalcButton"/>
<Button android:id="@+id/btnEquals" android:text="=" style="@style/CalcButton"/>
</GridLayout>
</LinearLayout>
样式:
<style name="CalcButton">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_weight">1</item>
<item name="android:textSize">18sp</item>
<item name="android:padding">16dp</item>
</style>
三、实现功能逻辑
1. 声明变量
在 MainActivity.java
中,定义需要的变量:
public class MainActivity extends AppCompatActivity {
private TextView tvDisplay;
private double firstOperand = 0;
private double secondOperand = 0;
private String operator = "";
private boolean isNewInput = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDisplay = findViewById(R.id.tvDisplay);
setupListeners();
}
}
2. 设置按钮监听事件
为每个按钮绑定点击事件:
private void setupListeners() {
findViewById(R.id.btn0).setOnClickListener(v -> appendNumber("0"));
findViewById(R.id.btn1).setOnClickListener(v -> appendNumber("1"));
findViewById(R.id.btn2).setOnClickListener(v -> appendNumber("2"));
findViewById(R.id.btn3).setOnClickListener(v -> appendNumber("3"));
findViewById(R.id.btn4).setOnClickListener(v -> appendNumber("4"));
findViewById(R.id.btn5).setOnClickListener(v -> appendNumber("5"));
findViewById(R.id.btn6).setOnClickListener(v -> appendNumber("6"));
findViewById(R.id.btn7).setOnClickListener(v -> appendNumber("7"));
findViewById(R.id.btn8).setOnClickListener(v -> appendNumber("8"));
findViewById(R.id.btn9).setOnClickListener(v -> appendNumber("9"));
findViewById(R.id.btnAdd).setOnClickListener(v -> setOperator("+"));
findViewById(R.id.btnSubtract).setOnClickListener(v -> setOperator("-"));
findViewById(R.id.btnMultiply).setOnClickListener(v -> setOperator("*"));
findViewById(R.id.btnDivide).setOnClickListener(v -> setOperator("/"));
findViewById(R.id.btnDot).setOnClickListener(v -> appendNumber("."));
findViewById(R.id.btnEquals).setOnClickListener(v -> calculate());
findViewById(R.id.btnClear).setOnClickListener(v -> clearAll());
findViewById(R.id.btnSign).setOnClickListener(v -> toggleSign());
findViewById(R.id.btnPercent).setOnClickListener(v -> applyPercent());
}
3. 数字和操作符逻辑
数字输入:
private void appendNumber(String number) {
if (isNewInput) {
tvDisplay.setText("");
isNewInput = false;
}
tvDisplay.append(number);
}
设置操作符:
private void setOperator(String op) {
firstOperand = Double.parseDouble(tvDisplay.getText().toString());
operator = op;
isNewInput = true;
}
4. 计算结果
private void calculate() {
secondOperand = Double.parseDouble(tvDisplay.getText().toString());
double result = 0;
switch (operator) {
case "+":
result = firstOperand + secondOperand;
break;
case "-":
result = firstOperand - secondOperand;
break;
case "*":
result = firstOperand * secondOperand;
break;
case "/":
if (secondOperand != 0) {
result = firstOperand / secondOperand;
} else {
tvDisplay.setText("Error");
return;
}
break;
}
tvDisplay.setText(String.valueOf(result));
isNewInput = true;
}
5. 清除功能
private void clearAll() {
firstOperand = 0;
secondOperand = 0;
operator = "";
tvDisplay.setText("0");
isNewInput = true;
}
6. 其他功能
百分比:
private void applyPercent() {
double current = Double.parseDouble(tvDisplay.getText().toString());
tvDisplay.setText(String.valueOf(current / 100));
isNewInput = true;
}
**正负号
切换:**
private void toggleSign() {
double current = Double.parseDouble(tvDisplay.getText().toString());
tvDisplay.setText(String.valueOf(-current));
}
四、运行与测试
-
运行项目
点击 Android Studio 的Run
按钮,在模拟器或真实设备上测试应用。 -
测试功能
验证加减乘除、百分比、正负切换等功能是否正确。
五、总结
通过本文的项目开发,你学习了以下内容:
- 使用 Android Studio 创建用户界面。
- 在 Android 中处理按钮点击事件。
- 实现计算器的核心逻辑,包括实时计算和错误处理。
扩展这个项目,你可以添加更多高级功能,如历史记录、科学计算模式等。继续尝试,相信你会开发出更复杂、更实用的应用!