Android简单控件实现简易计算器

学了一些Android的简单控件,用这些布局和控件,设计并实现一个简单计算器。

计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键,例如:从0到9的数字按钮、加减乘除与等号、正负号按钮、小数点 按钮、求倒数按钮、平方按钮、开方按钮,以及退格、清空、取消等控制按钮。通过这些按键操作,能 够实现整数和小数的四则运算,以及求倒数、求平方、求开方等简单运算

按照计算器App的效果图,大致分布着下列Android控件:

  • 线性布局LinearLayout:因为计算器界面整体从上往下布局,所以需要垂直方向的LinearLayout。
  • 网格布局GridLayout:计算器下半部分的几排按钮,正好成五行四列表格分布,适合采用 GridLayout。
  • 滚动视图ScrollView:虽然计算器界面不宽也不高,但是以防万一,最好还是加个垂直方向的 ScrollView。
  • 文本视图TextView:很明显顶部标题“简单计算器”就是TextView,且文字居中显示;标题下面的计 算结果也需要使用TextView,且文字靠右靠下显示。
  • 按钮Button:几乎所有的数字与运算符按钮都采用了Button控件。
  • 图像按钮ImageButton:开根号的运算符“√”虽然能够打出来,但是右上角少了数学课本上的一横, 所以该按钮要显示一张标准的开根号图片,这用到了ImageButton。

在这里插入图片描述

CalculatorActivity.java

package com.example.chapter03;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {private TextView tv_result;private String firstNum = ""; // 记录第一个操作数private String secondNum = ""; // 记录第二个操作数private String operator = ""; // 记录运算符private String result = ""; // 记录运算结果private String showText = ""; // 记录显示文本@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_calculator);tv_result = findViewById(R.id.tv_result);// 给每个按钮控件注册点击监听器findViewById(R.id.btn_clear).setOnClickListener(this);findViewById(R.id.btn_cancel).setOnClickListener(this);findViewById(R.id.btn_plus).setOnClickListener(this);findViewById(R.id.btn_minus).setOnClickListener(this);findViewById(R.id.btn_multiply).setOnClickListener(this);findViewById(R.id.btn_reciprocal).setOnClickListener(this);findViewById(R.id.btn_equal).setOnClickListener(this);findViewById(R.id.ib_sqrt).setOnClickListener(this);findViewById(R.id.btn_divide).setOnClickListener(this);findViewById(R.id.btn_zero).setOnClickListener(this);findViewById(R.id.btn_one).setOnClickListener(this);findViewById(R.id.btn_two).setOnClickListener(this);findViewById(R.id.btn_three).setOnClickListener(this);findViewById(R.id.btn_four).setOnClickListener(this);findViewById(R.id.btn_five).setOnClickListener(this);findViewById(R.id.btn_six).setOnClickListener(this);findViewById(R.id.btn_seven).setOnClickListener(this);findViewById(R.id.btn_eight).setOnClickListener(this);findViewById(R.id.btn_nine).setOnClickListener(this);findViewById(R.id.btn_dot).setOnClickListener(this);}@Overridepublic void onClick(View v) {String inputText;if (v.getId() == R.id.ib_sqrt) {inputText = "√";} else {inputText = ((TextView) v).getText().toString();}switch (v.getId()) {// 清除case R.id.btn_clear:clear();break;case R.id.btn_cancel:if (!showText.equals("")) {showText = showText.substring(0, showText.length() - 1);if (operator.equals("")) {firstNum = showText;} else {secondNum = showText;}refreshResult(showText);}break;case R.id.btn_plus:case R.id.btn_minus:case R.id.btn_multiply:case R.id.btn_divide:if (firstNum.equals("")) {firstNum = "0";}operator = inputText;refreshResult(showText + inputText);break;case R.id.btn_equal:double calculate_result = calculateFour();if (calculate_result == 0) {result = showText;} else {refreshOperate(String.valueOf(calculate_result));refreshResult(showText + "=" + result);}break;case R.id.ib_sqrt:if (operator.equals("")) {double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));refreshOperate(String.valueOf(sqrt_result));refreshResult("√" + firstNum + "=" + result);} else {double sqrt_result = Math.sqrt(Double.parseDouble(secondNum));secondNum = String.valueOf(sqrt_result);refreshResult(firstNum + operator + secondNum);}break;case R.id.btn_reciprocal:double reciprocal_result = 1 / Double.parseDouble(firstNum);refreshOperate(String.valueOf(reciprocal_result));refreshResult("1/" + showText + "=" + result);break;default:// 数字键if ((result.contains("Error")) || (!result.equals("") && operator.equals(""))) {clear();}if (operator.equals("")) {firstNum += inputText;} else {secondNum += inputText;}if (showText.equals("0") && !inputText.equals(".")) {refreshResult(inputText);} else {refreshResult(showText + inputText);}break;}}private double calculateFour() {if (secondNum.equals("")) {secondNum = "0";}switch (operator) {case "+":return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);case "-":return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);case "x":return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);case "÷":if (Double.parseDouble(secondNum) == 0) {clear();tv_result.setText("Error: 除数不能为0");return 0;}return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);}return 0;}// 清除private void clear() {refreshOperate("");refreshResult("");firstNum = "";secondNum = "";operator = "";result = "";showText = "";}// 刷新运算结果private void refreshOperate(String new_result) {result = new_result;firstNum = result;secondNum = "";operator = "";}// 刷新文本显示private void refreshResult(String text) {showText = text;tv_result.setText(showText);}
}

代码:Calculator.java,res/layout/activity_calculator.xml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58722.shtml

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

相关文章

开源生活-分布式管理

开源竞争(当自己没有办法彻底掌握一门技术的时候就彻底开源掉;培养出更多的依赖,让更多人帮助你完善你的技术,那么这不就是在砸罐子吗?一个行业里面总会有人先砸罐子的,你不如先砸罐子,还能听个…

责任链模式:解耦请求处理的设计模式

1. 引言 在复杂的软件系统中,请求的处理往往需要多个处理者共同参与。如何将这些处理者有效地串联起来,同时又不让请求的发起者直接依赖于具体的处理者,是一个值得关注的问题。责任链模式(Chain of Responsibility Pattern&#…

分布式数据库的发展历程与大规模应用的历史

分布式数据库技术经历了数十年的发展,从最初的理论研究到现今的广泛应用,逐渐成为应对海量数据和高并发需求的重要技术支撑。特别是在近20年里,分布式数据库的技术实现和应用场景不断丰富,已经成为互联网、大数据、云计算等现代产…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

Matplotlib可视化——三维图与莫比乌斯带可视化

实验名称 Matplotlib中的三维图绘制:莫比乌斯带的可视化 实验目标 三维的点和线三维轮廓图线框图和曲面图曲面三角形 举例:莫比乌斯带的可视化实验主要使用的Python库 名称版本简介Numpy1.19.5数组运算Matplotlib3.3.4数据可视化实验适用的对象 学习对象:本科学生、研究生…

clickhouse最佳实践(一):clickhouse千亿级日志系统单机到集群架构演进历程

clickhouse千亿级日志系统单机到集群架构演进历程 1. 初始阶段:单机部署2. 使用代理层3. 集群设计4. 数据迁移5. 监控和维护6.集群横向扩展 最佳实践系列文章持续完善中, 记录了业务系统从碰到瓶颈到迭代的过程 1. 初始阶段:单机部署 针对Cl…

ZeroNL2SQL:零样本 NL2SQL

发布于:2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL(NL2SQL)的转换是一个重要的研究领域,它允许非技术用户轻松访问和分析数据,在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

前端部署指南:手把手教你部署 Vue 项目

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-部署项目 前言 嗨喽伙伴们大家好,我是依旧青山。作为一名前端开发工程师&#xff…

usb外设枚举不到怎么查

明明内核配置了cdc_acm,dmesg | grep acm也有,lsusb却看不到设备。 排查思路: 主机端: 1、设备树是否使能。 2、主模式和从模式是否配置正确。 设备端: 设备端有条件的话可以插入其它设备看,或者复位…

Vivo开奖了,劝退价。。

vivo 也开奖了,不过有小伙伴反馈是个劝退价,甚至不如隔壁的 oppo,要说这两家也是渊源颇深,一家是绿厂,一家是蓝厂,高管也都是早期步步高出来的。 给大家盘一下开奖的信息,方便大家横向做个对比&…

Python 的 Pygame 库来开发一个游戏

import pygame import random# 初始化 Pygame pygame.init()# 设置屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height))# 设置标题 pygame.display.set_caption("飞机大战")# 加载图片 player_img pyga…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现4、源代码获取1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleButtonWindow.xma…

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper+代码——交叉注意力(Cross-Attention)

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力(Cross-Attention) 【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力(Cross-Attention) 文章目录 【…

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中,时间与效率直接决定着患者的生命。传统急救模式下,急救人员常通过视频或电话与医院医生进行沟通,以描述患者状况并依照指令行动。然而,这种信息传递方式往往因信息不完整或传递延…

测试自动化工具的横向对比

MicroAgent:这个AI智能体一键写代码并且自动测试!它比 Aider 更好吗? 待研究:https://blog.csdn.net/gitblog_00054/article/details/139541862 playright:这是一个python驱动的自动化框架,部署简单&#…

第八天: C语言深度探索:指针与函数的奥秘

1 字符指针与字符串处理 字符指针与数组的关系 在C语言中,字符串可以被视为字符数组。数组名可以看作是指向其第一个元素的指针。因此,我们可以使用相同类型的指针来访问数组中的每个元素。这种对应关系使得字符指针在处理字符串时显得特别方便。 c …

C++初阶——类与对象(上篇)

一、写在前面 类与对象是C不同于C语言的一个板块,内容很多,笔者把这部分分为三篇博客来讲解,希望能够帮助各位读者更容易地理解这些知识点。弄清楚这一部分之后,C就算是成功入门了。 二、面向过程和面向对象 C语言就是典型的面向…

Java如何实现PDF转高质量图片

大家好,我是 V 哥。在Java中,将PDF文件转换为高质量的图片可以使用不同的库,其中最常用的库之一是 Apache PDFBox。通过该库,你可以读取PDF文件,并将每一页转换为图像文件。为了提高图像的质量,你可以指定分…

论文略读:OneChart: Purify the Chart Structural Extraction via One Auxiliary Token

2024 旷视的work 图表解析模型 1 背景 对于之前的视觉语言模型,论文认为其有两点不足需要改进: 需要充分训练一个真正会看 chart 的 vision encoder单纯对文本输出算交叉熵损失,并不是最优的(如上图所示,当ground-tr…

STM32CubeMX学习(三) SPI+DMA通信

STM32CubeMX学习(三) SPIDMA通信 一、简介二、新建STM32CubeMX项目并使用外部时钟三、SPI3配置四、相关代码五、测试 一、简介 本文将基于STM32F103RCT芯片介绍如何在STM32CubeMXKEIL5开发环境下进行SPIDMA通信。 操作系统:WIN10 x64硬件电…