计算器设计思路
代码见github,地址如下:https://github.com/Hpsyche/Android_Calculator
计算器界面的实现
界面如下:
过程:
- 首先通过网格布局,设计网格为6行4列;
- 第一行放置文本标签textview,用于显示数字和符号,及回响计算结果;
- 第二行用于放置两个button,一个用于清除textview,一个用于清除textview的最后一个字符;
- 后面四行用于放置0-9、及±*/.=符号;
应注意:需要给textview和各个按钮添加id,以便在.java中实现对按钮的监听及对textview的回响显示。
MainActivity的设计
过程:
-
获取各按钮;
-
各按钮添加监听器及监听事件;
-
对于0-9和±*/,可以设置同一个监听器(否则代码太过于冗余),对此需要在监听器中先判断button的来源,并对应符号进行回响;
其关键代码:
class MyClick implements View.OnClickListener { @Override public void onClick(View v) { //获得view的名称中"button"的位置 int index=v.toString().lastIndexOf("button"); //view名称中有"button*"的信息,可利用*来确定事件来源者身份 String buttonNum=v.toString().substring(index+6,index+7); if(buttonNum.equals("A")){ sb.append("+"); } else if(buttonNum.equals("B")){ sb.append("-"); } else if(buttonNum.equals("C")){ sb.append("*"); } else if(buttonNum.equals("D")){ sb.append("/"); } else if(buttonNum.equals("O")){ sb.append("."); } //如果不属于+-*/. ,则直接添加即可 else { sb.append(buttonNum); } textView.setText(sb); } }
-
对于清除按钮的监听器,设置textview长度为0即可;
-
对于撤回按钮的监听器,先判断是否已为0,为0则设置为空即可;不为0则去除最后一位;
-
对于“=”的监听事件,是本设计的重点,也是最为复杂的;首先需要通过正则判断输入是否不符合运算规则:
- 若不符合,回显“输入有误!”
- 若符合,通过新建的utils工具类(下文介绍)计算出结果并回显;
-
Utils.Calculate设计
此类最为关键,用于计算结果
过程:
- 1.首先定义三个列表,用于存储各信息
- List math:用于存储计算式中的数字
- List flag:用于存储计算式中的符号
- List mulDiv:用于存储 “在flag列表中*或/的下标” 的list列表,以便后续的优先级运算
- 2.循环计算式中各字符,并将数字存储于math,将符号存储于flag,将mulDiv中;
- 3.若mulDiv不为空,则按先后计算mulDiv前后两数*或/的结果;
- 由于mulDiv存储的为flag列表的 * 或 / 的下标,故可利用flag,找到该 * 或 / 符号,并在math列表中找到其前后的数字;
- 判断flag及数字的类型(整型 / 浮点型),并进行 * 或 / 运算;
- 4.计算完毕后在math中remove前后两数,在flag中remove该符号,在mulDiv中remove第一位,并在math后重新添加计算结果;
- 5.循环步骤3-4至mulDiv为0,此时计算式只剩下±,原理大体同3-4,按先后计算flag前后两数*或/的结果,计算完毕后在math中remove前后两数,在flag中remove该符号,并在math后重新添加计算结果;
- 最终即可得出运算结果。
由于此算法较为复杂,在此贴出该Calculate工具类的完整代码:
package com.example.hpsyche.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 计算器工具类,负责计算结果
*/
public