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

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

相关推荐
子非衣13 分钟前
MySQL修改JSON格式数据示例
android·mysql·json
openinstall全渠道统计3 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫4 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫4 小时前
一句话说透Android里面的查找服务
android
双鱼大猫4 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫4 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
Earth explosion5 小时前
ide使用技巧与插件推荐
ide
双鱼大猫5 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫5 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫5 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android