当前位置: 首页 > article >正文

用 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 文件,设计用户界面。

完整布局代码:

<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));
}

四、运行与测试

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

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


五、总结

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

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

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


http://www.kler.cn/a/400464.html

相关文章:

  • kubernetes如何配置默认存储
  • 通过华为鲲鹏认证发行上市的集成平台产品推荐
  • 【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)
  • UniApp在Vue3的setup语法糖下自定义组件插槽详解
  • 极速入门数模电路
  • (一)- DRM架构
  • 集群聊天服务器(9)一对一聊天功能
  • 数据科学与SQL:如何计算排列熵?| 基于SQL实现
  • 10月回顾 | Apache SeaTunnel社区动态与进展一览
  • 【jvm】方法区的理解
  • 讨论大语言模型在学术文献应用中的未来与所带来的可能性和担忧
  • C++笔试面试题
  • leetcode 扫描线专题 06-leetcode.836 rectangle-overlap 力扣.836 矩形重叠
  • 无人机动力系统节能技术的未来发展趋势——CKESC电调小课堂12.1
  • Python 神经网络项目常用语法
  • C++---智能指针和内存泄露
  • 【网络安全 | 漏洞挖掘】邮件HTML注入
  • 群控系统服务端开发模式-应用开发-前端部门功能开发
  • 传奇996_25——ctrl+f11,ui标签,绘制自定义面板的参数
  • 学习大数据DAY61 宽表加工
  • 【惠州大亚湾】之维修戴尔服务器DELLR730XD
  • vue下载后端提供的文件/播放音频文件
  • Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案
  • 初始Python篇(3)—— 列表
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:集群资源动态分配的智慧(上)(23 / 30)
  • 使用弹性方法的 BP 网络学习改进算法详解