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

完整布局代码:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><!-- 显示屏 --><TextViewandroid: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" /><!-- 按钮区域 --><GridLayoutandroid: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;@Overrideprotected 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.mzph.cn/web/59947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHELL笔记(条件测试)

基本概念&#xff1a; 条件测试用于在 Shell 脚本中对各种条件进行判断&#xff0c;根据判断结果来决定是否执行特定的命令或代码块。条件测试可以用于比较数值、字符串&#xff0c;检查文件或目录的属性&#xff0c;以及判断命令的执行结果等。 格式&#xff1a; 格式1&…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…

微信小程序-prettier 格式化

一.安装prettier插件 二.配置开发者工具的设置 配置如下代码在setting.json里&#xff1a; "editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml"…

【Mac】未能完成该操作 Unable to locate a Java Runtime

重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令&#xff0c;原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

【WPF】Prism学习(五)

Prism Commands 1.错误处理&#xff08;Error Handling&#xff09; Prism 9 为所有的命令&#xff08;包含AsyncDelegateCommand&#xff09;提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言&#xff1a;这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 &#xff08;一&#xff09;结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema&#xff0c;…

2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索

Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中&#xff0c;图像与相关文本的一致性问题&#xff0c;如患者有病症但影像可能无明显异常&#xff0c;影响图像检索系统准确性。传统的基于文本的医学图像检索&#xff0…

初识Linux · 信号处理 · 续

目录 前言&#xff1a; 可重入函数 重谈进程等待和优化 前言&#xff1a; 在前文&#xff0c;我们已经介绍了信号产生&#xff0c;信号保存&#xff0c;信号处理的主题内容&#xff0c;本文作为信号处理的续篇&#xff0c;主要是介绍一些不那么重要的内容&#xff0c;第一个…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接&#xff1a;560.和为K的⼦数组 题目描述&#x…

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野&#xff0c;发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…

Scaling Law的“终结“还是新起点?——开源实践者的深度思考

作者&#xff1a;宋大宝&#xff0c;与大宝同学因那篇《回顾总结展望「融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI」》结识于今年春天&#xff0c;虽我们当时某些思想观念有些出入&#xff0c;也碰撞出了很多火花与共鸣&#xff0c;并持续地相互启发的走到了现在。他是…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真

引言 导航仿真是机器人自动化系统中不可或缺的一部分&#xff0c;能够帮助开发者在虚拟环境中测试机器人在复杂场景下的运动与路径规划。 在 Gazebo 仿真环境中&#xff0c;TurtleBot3 配合 ROS 操作系统提供了强大的导航功能。在进行导航仿真时&#xff0c;首先需要准备地图&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…

本草纲目数字化:Spring Boot在中药实验管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中药实验管理系统的相关信息成为必然。开发…