热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现简易计算器(可以实现连续计算)

这篇文章主要为大家详细介绍了Android实现简易计算器,可以实现连续计算,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

发一个库存程序,好像是几个礼拜之前写的吧,是一个用安卓实现的简易的计算器,写这个小程序之前,看了很多人写的计算器,觉得使用一个 EditText,并将它设置为不可编写,是比较好的解决方案。

设计思路主要是: 根据用户的点击,在一个 EditText 中显示用户输入的运算步骤,例如 1 * 5 + 8 - 5 , 这个运算步骤首先是字符串类型的,然后在经过系列步骤将字符串解析成为相应的实数计算,最终得出结果

我是用了两个 EditText ,第一个显示运算步骤(字符串类型),第二个专门用了保存要参与运算的数字,并实时对这个数字进行更新;

对于: “操作数 操作运算符 操作数”,可以定义一个数组来保存这两操作数,进行运算之后,将结果存储到数组的第一个元素,方便进行连续运算,然后下一个操作数存储到数组的第二个元素,‘'‘' 这样就实现了连续运算

在实现的过程当中,多处用到了类型转换,从字符串转换成浮点数,从浮点数转换成字符串等,进行类型转换是要特别小心,我就是因为类型转换是写错了,查bug查了老半天

效果图就是这样滴:

有几个小bug带修复:

1.运算没有优先级,完全是按用户输入的步骤来进行运算
2.连续按两次运算操作符会闪退,刚开始是按操作符也会闪退
3.其中的正负数转换按钮还没实行

由于最近要期中考试了,所以这几个小bug过一段时间再来修复,到时再更新

下面是代码:

MainActivity.java 文件

package com.example.calculator;

import android.content.Intent;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

 getResult2 result2 = new getResult2();


 Button button0;
 Button button1;
 Button button2;
 Button button3;
 Button button4;
 Button button5;
 Button button6;
 Button button7;
 Button button8;
 Button button9;
 Button button_point; //小数点
 Button button_clear; //清空


 //2个imageButton
 Button button_plus;
 Button button_minus;
 Button button_mutiply;
 Button button_divide;
 ImageButton button_equal; //等于
 ImageButton button_delete; //删除(退格)

 EditText edit_input; //输入框
 EditText editText2;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 ActionBar actiOnBar= getSupportActionBar();
 if (actionBar != null) {
 actionBar.hide();
 }
 ImageButton imageButton1 = (ImageButton) findViewById(R.id.title_imageButton1);
 imageButton1.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(MainActivity.this, SetActivity.class);
 startActivity(intent);
 }
 });


 //实例化按钮
 button0 = (Button) findViewById(R.id.button0);
 button1 = (Button) findViewById(R.id.button1);
 button2 = (Button) findViewById(R.id.button2);
 button3 = (Button) findViewById(R.id.button3);
 button4 = (Button) findViewById(R.id.button4);
 button5 = (Button) findViewById(R.id.button5);
 button6 = (Button) findViewById(R.id.button6);
 button7 = (Button) findViewById(R.id.button7);
 button8 = (Button) findViewById(R.id.button8);
 button9 = (Button) findViewById(R.id.button9);
 button_point = (Button) findViewById(R.id.button_point);
 button_clear = (Button) findViewById(R.id.button_clear);
 button_plus = (Button) findViewById(R.id.button_plus);
 button_minus = (Button) findViewById(R.id.button_minus);
 button_mutiply = (Button) findViewById(R.id.button_mutiply);
 button_divide = (Button) findViewById(R.id.button_divide);
 button_equal = (ImageButton) findViewById(R.id.button_equal);
 button_delete = (ImageButton) findViewById(R.id.button_delete);
 edit_input = (EditText) findViewById(R.id.main_ediText);
 editText2 = (EditText) findViewById(R.id.edtiText2);

 //设置点击事件
 button0.setOnClickListener((View.OnClickListener) this);
 button1.setOnClickListener((View.OnClickListener) this);
 button2.setOnClickListener((View.OnClickListener) this);
 button3.setOnClickListener((View.OnClickListener) this);
 button4.setOnClickListener((View.OnClickListener) this);
 button5.setOnClickListener((View.OnClickListener) this);
 button6.setOnClickListener((View.OnClickListener) this);
 button7.setOnClickListener((View.OnClickListener) this);
 button8.setOnClickListener((View.OnClickListener) this);
 button9.setOnClickListener((View.OnClickListener) this);
 button_point.setOnClickListener((View.OnClickListener) this);
 button_clear.setOnClickListener((View.OnClickListener) this);
 button_plus.setOnClickListener((View.OnClickListener) this);
 button_minus.setOnClickListener((View.OnClickListener) this);
 button_mutiply.setOnClickListener((View.OnClickListener) this);
 button_divide.setOnClickListener((View.OnClickListener) this);
 button_equal.setOnClickListener((View.OnClickListener) this);
 button_delete.setOnClickListener((View.OnClickListener) this);
 button_clear.setOnClickListener((View.OnClickListener) this);

 }

 @Override
 public void onClick(View v) {

 //str用来保存第一个EditText中的字符串
 String str = edit_input.getText().toString();

 //str2用来保存第二个EditText中的字符串
 String str2 = editText2.getText().toString();

 switch (v.getId()) {
 case R.id.button0:
 case R.id.button1:
 case R.id.button2:
 case R.id.button3:
 case R.id.button4:
 case R.id.button5:
 case R.id.button6:
 case R.id.button7:
 case R.id.button8:
 case R.id.button9:
 case R.id.button_point:

 edit_input.setText(str + ((Button) v).getText());
 editText2.setText(str2 + ((Button) v).getText());
 break;

 // + - * / 对应的值依次为 1 2 3 4,将值传入setOperation中,就执行相应的运算
 case R.id.button_plus:

 result2.setNumber(editText2.getText().toString()); //设置操作数
 result2.getResult();
 result2.setOperation(1);
 edit_input.setText(str + " " + ((Button) v).getText() + " "); //加上空格更美观
 str2 = "";
 editText2.setText(str2); //清空textView
 break;
 case R.id.button_minus:

 result2.setNumber(editText2.getText().toString()); //设置操作数
 result2.getResult();
 result2.setOperation(2);

 edit_input.setText(str + " " + ((Button) v).getText() + " "); //加上空格更美观
 str2 = "";
 editText2.setText(str2); //清空textView
 break;
 case R.id.button_mutiply:

 result2.setNumber(editText2.getText().toString()); //设置操作数
 result2.getResult();
 result2.setOperation(3); //设置操作符

 edit_input.setText(str + " " + ((Button) v).getText() + " "); //加上空格更美观
 str2 = "";
 editText2.setText(str2); //清空textView
 break;
 case R.id.button_divide:

 result2.setNumber(editText2.getText().toString()); //设置操作数
 result2.getResult();
 result2.setOperation(4);

 edit_input.setText(str + " " + ((Button) v).getText() + " "); //加上空格更美观
 str2 = "";
 editText2.setText(str2); //清空textView
 break;

 case R.id.button_delete:

 if (str != null && !str.equals("")) {
 //substring用来截取字符串的长度

 if (str.substring(str.length() - 1, str.length()) == " ") {
 //如果最后一个字符是空格,则删除最后两个字符,且eidtText2中字符串不发生变化
 edit_input.setText(str.substring(0, str.length() - 2));
 } else {
 //如果最后一个字符是数字
 edit_input.setText(str.substring(0, str.length() - 1));
 //将EditText2中的字符取出,去掉最后一个字符之后再存入
 String c2 = editText2.getText().toString();
 String c3 = c2.substring(0, c2.length() - 1);
 editText2.setText(c3);
 }
 }
 break;
 case R.id.button_clear:
 result2.setDoubleA1(0);
 result2.setDoubleA2(0);
 result2.setA1(" ");
 result2.setA2(" ");
 edit_input.setText("");
 editText2.setText("");
 break;
 case R.id.button_equal:
 result2.setNumber(editText2.getText().toString());
 double r = result2.getResult();
 String r2 = String.valueOf(r);
 editText2.setText(r2);
 result2.setA1(" ");
 result2.setA2(" ");
 str2 = "";
 break;
 }
 }

activity_main.xml 文件:

这里我用的是线性布局,同样也可以用网格布局

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 
 

 

 

 

 

getResult2.java 文件

还有一个getResult2 类,用来获得运算之后的结果

package com.example.calculator;

public class getResult2 {

 private String a1; //第一位操作数
 private double doubleA1; //实际参与运算

 private String a2; //第二位操作数
 private double doubleA2; //实际参与运算

 private int operation; //运算符

 double result; //结果

 //构造函数
 getResult2() {
 a1 = " ";
 a2 = " ";
 operation = 0;
 }

 void setA1(String A1) {
 a1 = A1;
 }

 void setA2(String A2) {
 a2 = A2;
 }

 void setDoubleA1(double x) {
 doubleA1 = x;
 }

 void setDoubleA2(double y) {
 doubleA2 = y;
 }
 //设置操作数,同时将字符串转换成数字,如果带小数点,转换成浮点数,否则转换成整数
 public void setNumber(String x) {
 if (a1.equals(" ")) {
 a1 = x;
 if (a1.contains(".")) {
 doubleA1 = Double.parseDouble(a1);
 } else {
 doubleA1 = Integer.parseInt(a1);
 }
 } else {
 a2 = x;
 if (a2.contains(".")) {
 doubleA2 = Double.parseDouble(a2);
 } else {
 doubleA2 = Integer.parseInt(a2);
 }
 }
 }

 public void setOperation(int i) {
 operation = i;
 }

 //进行运算,得到结果,同时将结果赋值给第一位操作数
 public double getResult() {
 if (operation == 1) {
 if (!a1.equals(" ") && a2.equals(" ")) {
 return 0;
 } else {
 result = doubleA1 + doubleA2;
 a1 = String.valueOf(result);
 doubleA1 = result;
 a2 = " ";
 }

 } else if (operation == 2) {
 if (!a1.equals("") && a2.equals("")) {
 return 0;
 } else {
 result = doubleA1 - doubleA2;
 a1 = String.valueOf(result);
 doubleA1 = result;
 a2 = " ";
 }
 } else if (operation == 3) {
 if (!a1.equals(" ") && a2.equals(" ")) {
 return 0;
 } else {
 result = doubleA1 * doubleA2;
 a1 = String.valueOf(result);
 doubleA1 = result;
 a2 = " ";
 }
 } else if (operation == 4) {
 if (!a1.equals(" ") && a2.equals(" ")) {
 return 0;
 } else {
 result = doubleA1 / doubleA2;
 a1 = String.valueOf(result);
 doubleA1 = result;
 a2 = " ";
 }
 }
 return result;
 }
}

更多计算器功能实现,请点击专题: 计算器功能汇总 进行学习

关于Android计算器功能的实现,查看专题:Android计算器 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
蓝羽月妞妞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有