1.开发工具

Android Studio

2.开发过程

2.1创建布局

布局.png

2.1.1设计样式

style.xml

@color/black

bold

20sp

wrap_content

wrap_content

true

match_parent

0dp

0.6

@color/white

horizontal

4

0dp

match_parent

1

25sp

@color/gray

@color/black

2.1.2布局文件

activity_main.xml

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity"

android:background="@color/gray">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/white"

android:layout_marginTop="0dp"

android:orientation="vertical"

android:weightSum="5"

>

android:id="@+id/input"

android:layout_width="match_parent"

android:layout_height="0dp"

android:textSize="40sp"

android:text=""

android:gravity="right"

android:layout_weight="1" />

android:id="@+id/output"

android:layout_width="match_parent"

android:layout_height="0dp"

android:textSize="40sp"

android:text=""

android:textStyle="bold"

android:textColor="@color/black"

android:gravity="right"

android:layout_marginTop="0dp"

android:layout_weight="1" />

style="@style/btn_line_style">

android:id="@+id/btn_left"

android:text="("

style="@style/btn_style"/>

android:id="@+id/btn_right"

android:text=")"

style="@style/btn_style"/>

android:id="@+id/btn_del"

android:text="DEL"

style="@style/btn_style"/>

android:id="@+id/btn_ac"

android:text="AC"

style="@style/btn_style"/>

style="@style/btn_line_style">

android:id="@+id/btn_7"

android:text="7"

style="@style/btn_style"/>

android:id="@+id/btn_8"

android:text="8"

style="@style/btn_style"/>

android:id="@+id/btn_9"

android:text="9"

style="@style/btn_style"/>

android:id="@+id/btn_multiply"

android:text="*"

style="@style/btn_style"/>

style="@style/btn_line_style">

android:id="@+id/btn_4"

android:text="4"

style="@style/btn_style"/>

android:id="@+id/btn_5"

android:text="5"

style="@style/btn_style"/>

android:id="@+id/btn_6"

android:text="6"

style="@style/btn_style"/>

android:id="@+id/btn_divide"

android:text="÷"

style="@style/btn_style"/>

style="@style/btn_line_style">

android:id="@+id/btn_1"

android:text="1"

style="@style/btn_style"/>

android:id="@+id/btn_2"

android:text="2"

style="@style/btn_style"/>

android:id="@+id/btn_3"

android:text="3"

style="@style/btn_style"/>

android:id="@+id/btn_minus"

android:text="-"

style="@style/btn_style"/>

style="@style/btn_line_style">

android:id="@+id/btn_0"

android:text="0"

style="@style/btn_style"/>

android:id="@+id/btn_point"

android:text="."

style="@style/btn_style"/>

android:id="@+id/btn_plus"

android:text="+"

style="@style/btn_style"/>

android:id="@+id/btn_equal"

android:text="="

style="@style/btn_style"/>

2.2 Java代码

2.2.1 MainActivity.java

package com.example.calculator02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

//public class MainActivity extends AppCompatActivity {

//

// @Override

// protected void onCreate(Bundle savedInstanceState) {

// super.onCreate(savedInstanceState);

// setContentView(R.layout.activity_main);

// }

//}

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Button btn_0;

Button btn_1;

Button btn_2;

Button btn_3;

Button btn_4;

Button btn_5;

Button btn_6;

Button btn_7;

Button btn_8;

Button btn_9;

Button btn_point; //小数点

Button btn_clear; //清除

Button btn_del; //删除

Button btn_plus;

Button btn_minus;

Button btn_multiply;

Button btn_divide;

Button btn_equal;

Button btn_left;

Button btn_right;

private TextView input;

private TextView output;

private StringBuilder pending = new StringBuilder();

private void initView() {

btn_0 = (Button) findViewById(R.id.btn_0);

btn_1 = (Button) findViewById(R.id.btn_1);

btn_2 = (Button) findViewById(R.id.btn_2);

btn_3 = (Button) findViewById(R.id.btn_3);

btn_4 = (Button) findViewById(R.id.btn_4);

btn_5 = (Button) findViewById(R.id.btn_5);

btn_6 = (Button) findViewById(R.id.btn_6);

btn_7 = (Button) findViewById(R.id.btn_7);

btn_8 = (Button) findViewById(R.id.btn_8);

btn_9 = (Button) findViewById(R.id.btn_9);

btn_point = (Button) findViewById(R.id.btn_point);

btn_clear = (Button) findViewById(R.id.btn_ac);

btn_del = (Button) findViewById(R.id.btn_del);

btn_plus = (Button) findViewById(R.id.btn_plus);

btn_minus = (Button) findViewById(R.id.btn_minus);

btn_multiply = (Button) findViewById(R.id.btn_multiply);

btn_divide = (Button) findViewById(R.id.btn_divide);

btn_equal = (Button) findViewById(R.id.btn_equal);

input = (TextView) findViewById(R.id.input);

output=(TextView) findViewById(R.id.output);

btn_left = (Button) findViewById(R.id.btn_left);

btn_right = (Button) findViewById(R.id.btn_right);

btn_0.setOnClickListener(this);

btn_1.setOnClickListener(this);

btn_2.setOnClickListener(this);

btn_3.setOnClickListener(this);

btn_4.setOnClickListener(this);

btn_5.setOnClickListener(this);

btn_6.setOnClickListener(this);

btn_7.setOnClickListener(this);

btn_8.setOnClickListener(this);

btn_9.setOnClickListener(this);

btn_point.setOnClickListener(this);

btn_plus.setOnClickListener(this);

btn_equal.setOnClickListener(this);

btn_minus.setOnClickListener(this);

btn_multiply.setOnClickListener(this);

btn_del.setOnClickListener(this);

btn_divide.setOnClickListener(this);

btn_clear.setOnClickListener(this);

btn_divide.setOnClickListener(this);

btn_left.setOnClickListener(this);

btn_right.setOnClickListener(this);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

public void onClick(View v) {

int last = 0;

if(pending.length()!=0)

{

last = pending.codePointAt(pending.length()-1);

}

switch (v.getId()) {

case R.id.btn_0:

pending = pending.append("0");

input.setText(pending);

break;

case R.id.btn_1:

pending = pending.append("1");

input.setText(pending);

break;

case R.id.btn_2:

pending = pending.append("2");

input.setText(pending);

break;

case R.id.btn_3:

pending = pending.append("3");

input.setText(pending);

break;

case R.id.btn_4:

pending = pending.append("4");

input.setText(pending);

break;

case R.id.btn_5:

pending = pending.append("5");

input.setText(pending);

break;

case R.id.btn_6:

pending = pending.append("6");

input.setText(pending);

break;

case R.id.btn_7:

pending = pending.append("7");

input.setText(pending);

break;

case R.id.btn_8:

pending = pending.append("8");

input.setText(pending);

break;

case R.id.btn_9:

pending = pending.append("9");

input.setText(pending);

break;

case R.id.btn_plus:

//if (last >= '0' && last <= '9' ) {

pending = pending.append("+");

// }

input.setText(pending);

break;

case R.id.btn_minus:

//if (last >= '0' && last <= '9') {

pending = pending.append("-");

// }

input.setText(pending);

break;

case R.id.btn_multiply:

// if (last >= '0' && last <= '9' ) {

pending = pending.append("*");

// }

input.setText(pending);

break;

case R.id.btn_divide:

// if (last >= '0' && last <= '9' ) {

pending = pending.append("/");

// }

input.setText(pending);

break;

case R.id.btn_point:

if (judje1()) {

pending = pending.append(".");

input.setText(pending);

}

break;

case R.id.btn_right:// )右括号

if((last>='0' &&last<='9'||last==')')&&judje2()==1) {

pending = pending.append(")");

input.setText(pending);

}

break;

case R.id.btn_left:// (左括号

if((last!='(')||(last<='0' &&last>='9')){

pending = pending.append("(");

input.setText(pending);

}

break;

case R.id.btn_del: //删除

if (pending.length() != 0) {

pending = pending.delete(pending.length() - 1, pending.length());

input.setText(pending);

}

break;

case R.id.btn_ac: //清空

pending = pending.delete(0, pending.length());

input.setText(pending);

output.setText(pending);

break;

case R.id.btn_equal: // =等于

if ((pending.length() > 1)) {

InfixInToDuffix inf = new InfixInToDuffix();

String jieguo;

try {

String a = inf.toSuffix(pending);

jieguo = inf.dealEquation(a);

} catch (Exception ex) {

jieguo = "Error";

}

// output.setText(pending + "=" + jieguo);

output.setText(jieguo);

pending = pending.delete(0, pending.length());

if (Character.isDigit(jieguo.charAt(0))) {

pending = pending.append(jieguo);

}

}

break;

default:

break;

}

}

private boolean judje1() {

String a = "+-*/.";

int[] b = new int[a.length()];

int max;

for (int i = 0; i < a.length(); i++) {

String c = "" + a.charAt(i);

b[i] = pending.lastIndexOf(c);

}

Arrays.sort(b);

if (b[a.length() - 1] == -1) {

max = 0;

} else {

max = b[a.length() - 1];

}

if (pending.indexOf(".", max) == -1) {

return true;

} else {

return false;

}

}

private int judje2(){

int a=0,b=0;

for(int i = 0 ; i < pending.length() ;i++){

if(pending.charAt(i)=='(' ) {

a++;

}

if(pending.charAt(i)==')' ) {

b++;

}

}

if(a == b)

return 0;

if(a > b)

return 1;

return 2;

}

}

2.2.2 InfixInToDuffix.java

package com.example.calculator02;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.lang.*;

import java.util.ArrayList;

import java.util.*;

public class InfixInToDuffix {

//使用集合定义好符号的运算优先级别

private static final Mapbasic =new HashMap();

static {

basic.put('-',1);

basic.put('+', 1);

basic.put('*', 2);

basic.put('/', 2);

basic.put('(', 0);//在运算中 ()的优先级最高,但是此处因程序中需要 故设置为0

}

//将中缀表达式转换为后缀表达式

public String toSuffix(StringBuilder infix){

List queue = new ArrayList(); //定义队列 用于存储 数字 以及最后的 后缀表达式

List stack = new ArrayList(); //定义栈 用于存储 运算符 最后stack中会被 弹空

char[] charArr = infix.substring(0,infix.length()).trim().toCharArray(); //字符数组 用于拆分数字或符号

String standard = "*/+-()"; //判定标准 将表达式中会出现的运算符写出来

char ch = '&'; //在循环中用来保存 字符数组的当前循环变量的 这里仅仅是初始化一个值 没有意义

int len = 0; //用于记录字符长度 【例如100*2,则记录的len为3 到时候截取字符串的前三位就是数字】

for (int i = 0; i < charArr.length; i++) { //开始迭代

ch = charArr[i]; //保存当前迭代变量

if(Character.isDigit(ch)) { //如果当前变量为 数字

len++;

}else if(ch == '.'){ //如果当前变量为 . 会出现在小数里面

len++;

}else if(standard.indexOf(ch) != -1) { //如果是上面标准中的 任意一个符号

if(len > 0) { //长度也有

queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i))); //说明符号之前的可以截取下来做数字

len = 0; //长度置空

}

if(ch == '(') { //如果是左括号

stack.add(ch); //将左括号 放入栈中

continue; //跳出本次循环 继续找下一个位置

}

if (!stack.isEmpty()) { //如果栈不为empty

int size = stack.size() - 1; //获取栈的大小-1 即代表栈最后一个元素的下标

boolean flag = false; //设置标志位

while (size >= 0 && ch == ')' && stack.get(size) != '(') { //若当前ch为右括号,则 栈里元素从栈顶一直弹出,直到弹出到 左括号

queue.add(String.valueOf(stack.remove(size))); //注意此处条件:ch并未入栈,所以并未插入队列中;同样直到找到左括号的时候,循环结束了,所以左括号也不会放入队列中【也就是:后缀表达式中不会出现括号】

size--; //size-- 保证下标永远在栈最后一个元素【栈中概念:指针永远指在栈顶元素】

flag = true; //设置标志位为true 表明一直在取()中的元素

}

if(ch==')'&&stack.get(size) == '('){

flag = true;

}

while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) { //若取得不是()内的元素,并且当前栈顶元素的优先级>=对比元素 那就出栈插入队列

queue.add(String.valueOf(stack.remove(size))); //同样 此处也是remove()方法,既能得到要获取的元素,也能将栈中元素移除掉

size--;

}

}

if(ch != ')') { //若当前元素不是右括号

stack.add(ch); //就要保证这个符号 入栈

} else { //否则就要出栈 栈内符号

stack.remove(stack.size() - 1);

}

}

if(i == charArr.length - 1) { //如果已经走到了 中缀表达式的最后一位

if(len > 0) { //如果len>0 就截取数字

queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len+1, i+1)));

}

int size = stack.size() - 1; //size表示栈内最后一个元素下标

while (size >= 0) { //一直将栈内 符号全部出栈 并且加入队列中 【最终的后缀表达式是存放在队列中的,而栈内最后会被弹空】

queue.add(String.valueOf(stack.remove(size)));

size--;

}

}

}

String a = queue.toString();

return a.substring(1,a.length()-1);

}

public String dealEquation(String equation){

String [] arr = equation.split(", "); //根据, 拆分字符串

List list = new ArrayList(); //用于计算时 存储运算过程的集合【例如list中当前放置 100 20 5 / 则取出20/5 最终将结果4存入list 此时list中结果为 100 4 】

for (int i = 0; i < arr.length; i++) { //此处就是上面说的运算过程, 因为list.remove的缘故,所以取出最后一个数个最后两个数 都是size-2

int size = list.size();

switch (arr[i]) {

case "+": double a = Double.parseDouble(list.remove(size-2))+ Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(a)); break;

case "-": double b = Double.parseDouble(list.remove(size-2))- Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(b)); break;

case "*": double c = Double.parseDouble(list.remove(size-2))* Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(c)); break;

case "/": double d = Double.parseDouble(list.remove(size-2))/ Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(d)); break;

default: list.add(arr[i]); break; //如果是数字 直接放进list中

}

}

return list.size()

== 1 ? list.get(0) : "运算失败" ; //最终list中仅有一个结果,否则就是算错了

}

}

3.细节完善

3.1修改Button背景色

在 res/drawable 文件夹下创建 setbtn_bg.xml 文件

setbtn_bg.xml

3.2更改状态栏颜色

修改 themes.xml 文件

@color/btn_bg

3.3修改图标

将图标的图片资源 calculator_icon 放入资源文件夹,修改 AndroidManifest.xml 文件

android:icon="@mipmap/calculator_icon"

android 计算器,Android实战:计算器相关推荐

  1. Android实战-计算器案例

    需求描述 界面设计 思路分析 CalculatorActivity.java package com.example.learn;import android.os.Bundle; import an ...

  2. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

  3. Android Studio实现简单计算器

    代码: activity_3.xml <?xml version="1.0" encoding="utf-8"?> <androidx.con ...

  4. Android小程序-简易计算器的实现

    目标效果:   通过编写代码,可以实现整数和小数的加减乘除运算,以及删除和清空的功能. 1.页面中Button使用的是线性布局,最外边一个是父布局,第一行C,DEL,/,*为第一个子布局,第二行7,8 ...

  5. 简单的Android程序多少钱,Android简单程序利息计算器

    我在编程Android的第一课,并为我的第一次尝试,我试图开发一个利息计算器.该应用程序启动,但然后崩溃.代码如下:Android简单程序利息计算器 package com.example.vitor ...

  6. Android入门之简易计算器(一)

    Android Android入门之简易计算器(一) 文章目录 Android Android入门之简易计算器(一) @[TOC](文章目录) 前言 一.项目结构 二.界面显示 三.前端界面 1.界面 ...

  7. Android实现简单的计算器

    android的布局和配置文件 1.下面就是android实现的计算器的布局配置,可以看见基本是线性布局,这样的好处是界面简洁明了 <LinearLayout xmlns:android=&qu ...

  8. Android实现简单的计算器功能

    Android实现简单的计算器功能 **前言:**通过Android实现简单的计算器功能,实现简单的加.减.乘.除操作. 效果图如下: 第一步 布局文件:activity_main.xml <? ...

  9. Android开发应用案例——简易计算器(附完整源码)

    Android开发-AS学习(一) Android开发-AS学习(二) 使用android studio开发简易计算器app(完整源码可在博主资源中自行下载) 最终效果: 开发步骤: 创建一个名为ca ...

最新文章

  1. MP实战系列(二)之集成swagger
  2. 【小程序】汇编实现判断回文
  3. 攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk
  4. Navicat premiu的导入和导出
  5. MySQL 日期时间类型
  6. GitH2月份开源项目
  7. Page 和Ability之间区别
  8. Java分段函数选择结构,编程流程作业选择结构(50题)
  9. SQLite_Android
  10. AttributeError: type object 'h5py.h5.H5PYConfig' has no attribute '__reduce_
  11. 主函数是c语言的入口,代码逆向(一)——寻找main函数入口
  12. android 4.4 生僻字,Android上显示生僻字的方法
  13. Core Location 电子围栏:入门
  14. 白话区块链 之 14 - ​区块链的技术意义
  15. Verilog学习日志(2021.7.31)
  16. java 区分大小写_Java区分大小写
  17. 怎么把PPT幻灯片里背景图片拿出来
  18. Win10怎么设置不进入屏保也不关闭显示器
  19. CorelCAD 2018 for Mac中文破解版永久激活方法
  20. Pikachu靶场全关攻略(超详细!)

热门文章

  1. jQuery实现 自动滚屏操作
  2. HTML简介及转义字符大全
  3. HAUTOJ1062
  4. EMLOG模板山河网站主题分享
  5. 使用modesim仿真的坑记录所有解决方法
  6. GPS软件接收机(3)——跟踪
  7. MATLAB语音信号处理
  8. MGF病毒的利用代码
  9. MFC界面布局、效果
  10. 计算机信息安全管理实验教程答案,“信息安全”课程习题及参考答案