用 Android Studio 从零开发一个多功能计算器应用


简介

计算器是每个学习 Android 开发者必经的经典项目之一。本篇文章将带你创建一个功能更强大的计算器应用,支持基本的加减乘除运算、带小数点的输入以及更多操作符功能。通过这个项目,你将全面掌握 Android 的布局设计、事件处理和逻辑实现技巧。


一、功能设计

基础功能
  1. 支持基本运算:加、减、乘、除。
  2. 支持小数点输入:可以输入和计算小数。
  3. 实时显示结果:输入数字和符号后立即显示计算结果。
进阶功能
  1. 清除功能:重置当前计算状态。
  2. 百分比运算:支持百分比的简单操作。
  3. 正负号切换:支持正负数输入。

二、项目创建与布局设计

1. 创建新项目
  • 打开 Android Studio,点击 New Project
  • 选择 Empty Activity 模板,命名项目为 AdvancedCalculator
  • 选择编程语言为 JavaKotlin
2. 布局设计

打开 res/layout/activity_main.xml 文件,设计用户界面。

完整布局代码:

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>

样式:

xml 复制代码
<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 中,定义需要的变量:

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. 设置按钮监听事件

为每个按钮绑定点击事件:

java 复制代码
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. 数字和操作符逻辑

数字输入:

java 复制代码
private void appendNumber(String number) {
    if (isNewInput) {
        tvDisplay.setText("");
        isNewInput = false;
    }
    tvDisplay.append(number);
}

设置操作符:

java 复制代码
private void setOperator(String op) {
    firstOperand = Double.parseDouble(tvDisplay.getText().toString());
    operator = op;
    isNewInput = true;
}
4. 计算结果
java 复制代码
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. 清除功能
java 复制代码
private void clearAll() {
    firstOperand = 0;
    secondOperand = 0;
    operator = "";
    tvDisplay.setText("0");
    isNewInput = true;
}
6. 其他功能

百分比:

java 复制代码
private void applyPercent() {
    double current = Double.parseDouble(tvDisplay.getText().toString());
    tvDisplay.setText(String.valueOf(current / 100));
    isNewInput = true;
}

**正负号

切换:**

java 复制代码
private void toggleSign() {
    double current = Double.parseDouble(tvDisplay.getText().toString());
    tvDisplay.setText(String.valueOf(-current));
}

四、运行与测试

  1. 运行项目

    点击 Android Studio 的 Run 按钮,在模拟器或真实设备上测试应用。

  2. 测试功能

    验证加减乘除、百分比、正负切换等功能是否正确。


五、总结

通过本文的项目开发,你学习了以下内容:

  1. 使用 Android Studio 创建用户界面。
  2. 在 Android 中处理按钮点击事件。
  3. 实现计算器的核心逻辑,包括实时计算和错误处理。

扩展这个项目,你可以添加更多高级功能,如历史记录、科学计算模式等。继续尝试,相信你会开发出更复杂、更实用的应用!

相关推荐
fanged3 小时前
天马G前端的使用
android·游戏
oioihoii4 小时前
如何设置 Visual Studio 在调试停止时自动关闭控制台
ide·visual studio
曹申阳5 小时前
1. 使用VSCode开发uni-app环境搭建
ide·vscode·uni-app
大江东去浪淘尽千古风流人物6 小时前
【Wins】Visual Studio memory leak check使用教程
ide·visual studio
molong9317 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin
每天更新7 小时前
VSCODE 使用GDB
ide·vscode·编辑器
paoqi 包奇8 小时前
pycharm中使用anaconda指定虚拟环境
ide·python·pycharm
叶辞树8 小时前
Android framework调试和AMS等服务调试
android
傅科摆 _ py9 小时前
解决 Vscode 中运行键突然消失的问题
ide·vscode·编辑器
丨Sky丨夜吻9 小时前
vscode扩展
ide·vue.js·vscode