Android做一个简单的计算器

20200617

今天实现了一个能加减乘除的简单计算器,界面大致如下:
Android做一个简单的计算器_第1张图片
首先是画界面,挺简单的,就是一个四个竖直布局的LinerLayout加一个TextView。我看到网上很多计算器都是用的EditView,个人感觉没有必要,毕竟只是个按键输入的计算器,又不需要自己键盘手动输入。但是有一点就是=号键,本来是在最后一个LinerLayout里面的,但是我不管用什么办法总是填不满空缺,会导致最后一列较其他列短一些,所以将它单独拉出来布局了。(手动设置高度应该可以做到,但是感觉可能无法适配不同机型。)

具体布局方式也很简单,所有的LinerLayout宽高都匹配文本(wrap_content),从左数第一列开始依次设置约束条件。为了给TextView留出空间,前三列都只需要设置start、end、bottom三个方向的约束。最后一列因为需要单独分出=号键的空间,所以设置start、top、end三个方向的约束,top对齐前三列就好了。最后是=号键,设置一下四个方位的约束,然后因为之前的LinerLayout设置了10dp的间距(layout_margin),所以也给=号键设置一下间距。至于LinerLayout里面的各个按钮,全部设置wrap_content就好了。这个主要是工作量大一点,每一个都要设置id和text。
Android做一个简单的计算器_第2张图片
Android做一个简单的计算器_第3张图片
然后是代码部分,也就是一大串的注册布局Button add = (Button)findViewById()什么的。然后让MainActivity实现一个View.OnClickListener,重写它的onClick方法,将所有button的监听器全部设为this( xxx.setOnclickListener(this) )。再然后在onClick里面写一堆case。
Android做一个简单的计算器_第4张图片
除了加减乘除、清零、删除、等于号以外,其他的按钮事件都跟上图一样。清零就直接setText("");删除要自己写一个删除方法,在点击事件里调用。在删除方法里,先将String字符串转化为char数组,然后依次拼接到倒数第二位。

然后就是最麻烦的加减乘除和计算操作了。最开始我是想
先输入一个完整的算式,在按下等号键的时候再对这个算式进行判断,可运算就算出结果,否则就返回错误提示,这样就只需要在等号键的点击事件里加入两个方法就好了。但是后来发现这样做太难实现了,首先要判断一个冗长的算式是否是可行的就很麻烦,然后还可能包含了许多个运算符号,判断这些运算符号的运算顺序又要花费很多精力。**最主要是当我想用indexof()来返回一个符号的坐标时,它总是会给我返回第一个,我也不知道该如何返回一个字符串内多个相同字符的位置。**所以我是将判断算式是否成立和解出算式合并成了一个方法,然后每次按下加减乘除或者等号键时都会调用一次,这样就能保证每次只做一次运算。
Android做一个简单的计算器_第5张图片
上面便是运算方法的加法部分,首先进入运算方法要先判断正负。因为此计算器没有括号,所以只考虑第一位可能为负的情况。我的做法就是将前面的减号去掉,然后判断算式是否成立,最后在计算的时候根据正负类型(isNegative)做相关运算或者添加负号。

1、经过首位数字的正负数判断后,因为是按下一次运算符号就进行一次判断和运算,所以每次算式中肯定只会包含一个或零个运算符(负号除外),因此依次判断是否存在加减乘除符号就行了,有就根据相关符号进行运算,没有就过掉。然后判断字符串的首尾是否为运算符(因为考虑到负数情况所以减号运算只需要判断尾部),如果是的话等式则不成立,然后用subString截取运算符前面部分,即去掉运算符号。因为每次按下运算符号键都会在字符串后面加一个相关运算符,如果不去掉现有的运算符的话,会导致后续算式错误。

2、如果通过了判断,就说明这个等式是成立的。然后根据运算符分隔字符串(加号前面要加\转义),这时候正常肯定会得到一个长度为2的数组,分别表示要运算的两个数字,然后判断这两个数字中是否存在小数点,若是存在则有要判断小数点是否位于数字的首尾,如果结果都为不在首尾的话,则表示两个要运算的数字是规范的。

3、接下来就可以进行运算(除法运算在运算之前还要加一个判断,判断第二个数字即除数不能为零)。这里开始我是加了一个判断,将小数与整数区分,后面感觉没什么必要就一律使用BigDecimal来计算了。然后在这里获取isNegative的值,将正负数运算进行区分并根据情况调用运算方法(这里注意如果是负数,记得要将isNegative重新设为false,以免影响后续的运算)。然后在TextView输出结果。

总的来说四个运算方法都大同小异,但是有一点要注意。就是当我们首位输入的就是运算符时,会因为等式不成立而删除运算符,但是由于有负数情况,所以减号需要可输入。
Android做一个简单的计算器_第6张图片
但是因为减号可输入,会导致当第二次再摁下减号时,由于前面判断负数时去掉了第一个减号,导致整个算式为空,然后经过一轮判断无误后,TextView会显示两个减号,然后再当案下第三个运算符号时,会导致一个减号通过判断然后在分割字符串那里报空指针异常。所以在减号运算开始要加一个判空,如果为空的话就将isNegative设为false,然后将TextView设为"",因为通过运算后会再加上负号。

还有一个问题就是减号运算的进入判断,除了判断是否存在减号外,还应该判断是否为负数,如果是复数的话需要过一遍以免出现重复符号。这样会导致一旦为负数就会走到减号这里,然后当输入第一个运算符(除开开头负号外)时,由于等式不成立而被返回,这样就走不到下面的乘除部分了,所以我将减法判断留到了最后判断,以免影响。
Android做一个简单的计算器_第7张图片

20200621
我发现自己有很多重复判断的地方,减号点击事件那里,只需要和其他三个一样加一个判断input.getText().equals("-")就好了,就不会出现两个负号的情况了,根本不需要些复杂的判断(比如什么isNegative就进入减法判断),反而还影响到其他运算方法。

主要还是水平不够吧,写起来感觉脑子晕乎乎的.如果有什么逻辑问题或者有更实用的方法还请各位大佬指教。

你可能感兴趣的:(Android做一个简单的计算器)