用 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. 实现计算器的核心逻辑,包括实时计算和错误处理。

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

相关推荐
C4rpeDime13 分钟前
自建MD5解密平台-续
android
鲤籽鲲2 小时前
C# Random 随机数 全面解析
android·java·c#
m0_548514776 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯6 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯6 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐7 小时前
Handle
android
m0_748232928 小时前
Android Https和WebView
android·网络协议·https
m0_748251728 小时前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity
带电的小王9 小时前
VSCode:VSCode安装 -- 最简洁的VSCode安装教程
ide·vscode·编辑器
m0_7482546610 小时前
go官方日志库带色彩格式化
android·开发语言·golang