Android入门学习——简易计算器

发布于 2023-10-10  649 次阅读


只看文字文档是无法快速上手的,所以打算写一个简易App上手,快速学习一些简单的知识点,循环渐进。本次参照Mac系统的计算器程序,模拟一个差不多的功能出来。

UI布局

参考一下我们的示例,感觉可以使用网格布局达到我们想要的效果,布局相关可以参考这里

file

网格布局

使用用单纯的网格布局,先做出一个想要的整体结构:

file

对应代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">
    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="1"
        android:columnCount="4"
        android:rowCount="6">
        <TextView
            android:id="@+id/tv_result"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="0"
            android:textSize="80sp"
            android:layout_columnSpan="4"
            />
        <TextView
            android:id="@+id/btn_ac"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="AC"/>
        <TextView
            android:id="@+id/btn_the"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="+/-"/>
        <TextView
            android:id="@+id/btn_percent"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="%"/>
        <TextView
            android:id="@+id/btn_divide"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="÷"/>
        <TextView
            android:id="@+id/btn_7"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="7"/>
        <TextView
            android:id="@+id/btn_8"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="8"/>
        <TextView
            android:id="@+id/btn_9"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="9"/>
        <TextView
            android:id="@+id/btn_multiplication"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="x"/>
        <TextView
            android:id="@+id/btn_4"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="4"/>
        <TextView
            android:id="@+id/btn_5"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="5"/>
        <TextView
            android:id="@+id/btn_6"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="6"/>
        <TextView
            android:id="@+id/btn_subtraction"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="-"/>
        <TextView
            android:id="@+id/btn_1"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="1"/>
        <TextView
            android:id="@+id/btn_2"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="2"/>
        <TextView
            android:id="@+id/btn_3"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="3"/>
        <TextView
            android:id="@+id/btn_add"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="+"/>
        <TextView
            android:id="@+id/btn_0"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:layout_columnSpan="2"
            android:gravity="center"
            android:textSize="20sp"
            android:text="0"/>
        <TextView
            android:id="@+id/btn_dot"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="."/>
        <TextView
            android:id="@+id/btn_equal"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:gravity="center"
            android:textSize="20sp"
            android:text="="/>
    </GridLayout>
</LinearLayout>

加入颜色

结构有了,现在需要加入不同的颜色,还有间距,让其看起来好看一些:

file

优化布局

但这时发现在长一点的手机上,显然看起来不是很好看,显示数字的地方太小了,按钮占比又还很大,由于外部容器使用的是LinearLayout布局,所以这里可以做一点调整,我们可以使内容显示区域和键盘区域平分,这样就会美观一些,稍微做了一下改造,把数字显示区域从GridLayout中提出,单独用一个约束布局(为了让里面的文字右下角显示和一些其他额外布局)包裹起来,并且设置各自的权重layout_weight="1",这样就达到了我们想要的效果:

file

完整代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
    android:background="#333"
    tools:context=".MainActivity">
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            tools:ignore="MissingConstraints">
                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    android:gravity="center">
                        <TextView
                            android:id="@+id/tv_result"
                            android:layout_height="wrap_content"
                            android:layout_width="wrap_content"
                            android:text="0"
                            android:textSize="80sp"
                            android:textColor="#eee"
                            />
                </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>
        <GridLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_weight="1"
            android:columnCount="4"
            android:rowCount="6">
                <TextView
                    android:id="@+id/btn_ac"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#444"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:text="AC"/>
                <TextView
                    android:id="@+id/btn_the"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#444"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:text="+/-"/>
                <TextView
                    android:id="@+id/btn_percent"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#444"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:text="%"/>
                <TextView
                    android:id="@+id/btn_divide"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#f95"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:text="÷"/>
                <TextView
                    android:id="@+id/btn_7"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="7"/>
                <TextView
                    android:id="@+id/btn_8"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="8"/>
                <TextView
                    android:id="@+id/btn_9"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="9"/>
                <TextView
                    android:id="@+id/btn_multiplication"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#f95"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginTop="1dp"
                    android:text="x"/>
                <TextView
                    android:id="@+id/btn_4"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="4"/>
                <TextView
                    android:id="@+id/btn_5"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="5"/>
                <TextView
                    android:id="@+id/btn_6"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="6"/>
                <TextView
                    android:id="@+id/btn_subtraction"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#f95"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginTop="1dp"
                    android:text="-"/>
                <TextView
                    android:id="@+id/btn_1"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="1"/>
                <TextView
                    android:id="@+id/btn_2"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="2"/>
                <TextView
                    android:id="@+id/btn_3"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="3"/>
                <TextView
                    android:id="@+id/btn_add"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#f95"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginTop="1dp"
                    android:text="+"/>
                <TextView
                    android:id="@+id/btn_0"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:layout_columnSpan="2"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="0"/>
                <TextView
                    android:id="@+id/btn_dot"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#555"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginRight="1dp"
                    android:layout_marginTop="1dp"
                    android:text="."/>
                <TextView
                    android:id="@+id/btn_equal"
                    android:layout_columnWeight="1"
                    android:layout_rowWeight="1"
                    android:gravity="center"
                    android:background="#f95"
                    android:textColor="#eee"
                    android:textSize="20sp"
                    android:layout_marginTop="1dp"
                    android:text="="/>
        </GridLayout>
</LinearLayout>

Activity编写

前端的简易UI布局写好了,现在我们进行Activity的编写,默认的activity_main.xml对应的Activity是MainActivity.java,可以从布局文件里的根节点的tools:context=".MainActivity"看出。

Activity的生命周期这些,可以参考这里
大致逻辑是这样:

  1. 定义一个计算的动作类,用来定义每个计算动作;
  2. 通过自带的方法findViewById,获取到对应的控件;
  3. 通过setBackgroundColor为每一个按钮绑定上对应的事件;
  4. 通过逻辑计算,把计算出来的结果显示到界面上;
  5. 按钮的时候,做一定的交互处理,如加减乘除的选中效果;

一、ComputeAction类如下:

public class ComputeAction {
    /**
     * 无
     */
    public static final int NONE=0;
    /**
     * 清空
     */
    public static final int AC=1;
    /**
     * 取反
     */
    public static final int THE=2;
    /**
     * 百分比
     */
    public static final int PERCENT=3;
    /**
     * 除
     */
    public static final int DIVIDE=4;
    /**
     * 乘
     */
    public static final int MULTIPLICATION=5;
    /**
     * 减
     */
    public static final int SUBTRACTION=6;
    /**
     * 加
     */
    public static final int ADD=7;
    /**
     * 小数点
     */
    public static final int DOT=8;
    /**
     * 等于
     */
    public static final int EQUAL=9;
}

二、获取到所有按钮和控件,由于数字按钮有统一性,所以我使用一个List来储存它,这样的话可以减少一定量的代码行数:

    private void initView(){
        tvResult=findViewById(R.id.tv_result);//结果显示组件
        btnAc=findViewById(R.id.btn_ac);//清空按钮
        btnThe=findViewById(R.id.btn_the);//取反按钮
        btnPercent=findViewById(R.id.btn_percent);//百分比按钮
        btnDivide=findViewById(R.id.btn_divide);//除
        btnMultiplication=findViewById(R.id.btn_multiplication);//乘
        btnSubtraction=findViewById(R.id.btn_subtraction);//减
        btnAdd=findViewById(R.id.btn_add);//加
        btnEqual=findViewById(R.id.btn_equal);//等
        btnDot=findViewById(R.id.btn_dot);//小数点
        //数字按钮,放到List里
        listNumber.add(findViewById(R.id.btn_0));
        listNumber.add(findViewById(R.id.btn_1));
        listNumber.add(findViewById(R.id.btn_2));
        listNumber.add(findViewById(R.id.btn_3));
        listNumber.add(findViewById(R.id.btn_4));
        listNumber.add(findViewById(R.id.btn_5));
        listNumber.add(findViewById(R.id.btn_6));
        listNumber.add(findViewById(R.id.btn_7));
        listNumber.add(findViewById(R.id.btn_8));
        listNumber.add(findViewById(R.id.btn_9));
    }

三、然后给对应的按钮,绑定对应的事件:

    private void initListener(){
        //循环绑定数字按钮
        for(TextView btnNumber:listNumber) {
            btnNumber.setOnClickListener((View view)->{
                handleNumberClick(Integer.parseInt(btnNumber.getText().toString()));//数字输入
            });
        }
        btnAdd.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.ADD);
        });
        btnSubtraction.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.SUBTRACTION);
        });
        btnMultiplication.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.MULTIPLICATION);
        });
        btnDivide.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.DIVIDE);
        });
        btnEqual.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.EQUAL);
        });
        btnAc.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.AC);
        });
        btnPercent.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.PERCENT);
        });
        btnThe.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.THE);
        });
        btnDot.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.DOT);
        });
    }

四、计算逻辑
简易版本的计算逻辑,实现了基本的计算,但存在一些bug后续再进行完善。

输入数字,根据一个变量[clearInput]来判断是否是拼接数字还是清空数字:

    private void handleNumberClick(Integer number){
        String strOldResult=tvResult.getText().toString();
        if(!clearInput) {
            //当前没有按下计算按钮,显示的数字累加即可
            if(strOldResult.equals("0")) {
                strOldResult="";
            }
            tvResult.setText(strOldResult+number.toString());
            clearInput=false;
            return;
        }
        tvResult.setText(number+"");
        clearInput=false;
    }

输入运算符,进行简单的逻辑运算:

    private Double handleCompute(Double oldNumber,Double number,int action){
        BigDecimal hisNumber=new BigDecimal(oldNumber);//历史结果
        BigDecimal newNumber=new BigDecimal(number);//输入结果
        BigDecimal result=new BigDecimal(0);
        if(action==ComputeAction.ADD) {
            //加
            result=hisNumber.add(newNumber);
        } else if(action==ComputeAction.SUBTRACTION) {
            //减
            result=hisNumber.subtract(newNumber);
        } else if(action==ComputeAction.MULTIPLICATION) {
            //乘
            result=hisNumber.multiply(newNumber);
        } else if(action==ComputeAction.DIVIDE) {
            //除
            result=hisNumber.divide(newNumber);
        } else if(action==ComputeAction.AC) {
            //ac
        } else if(action==ComputeAction.THE){
            //正反
        } else {
            result=hisNumber;
        }
        result=result.setScale(5,BigDecimal.ROUND_HALF_UP);
        return result.doubleValue();
    }

五、设置一个简单的交互效果,通过改变颜色实现,注意,这里的颜色需要先定义到values/colors.xml里才行

colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="black2">#444</color>
    <color name="orange">#ff9955</color>
    <color name="orange2">#ff8800</color>
</resources>

可以通过函数getColor获取到定义在xml里的颜色色值

    private void activeBtn(int action){
        int defColor=getColor(R.color.orange);
        btnDivide.setBackgroundColor(defColor);
        btnMultiplication.setBackgroundColor(defColor);
        btnSubtraction.setBackgroundColor(defColor);
        btnAdd.setBackgroundColor(defColor);

        if(action==ComputeAction.ADD) {
            //加
            btnAdd.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.SUBTRACTION) {
            //减
            btnSubtraction.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.MULTIPLICATION) {
            //乘
            btnMultiplication.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.DIVIDE) {
            //除
            btnDivide.setBackgroundColor(getColor(R.color.orange2));
        }
    }

这样,一个简易的计算器App就实现了

完整的代码

package com.liujto.androiddemo;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.io.Console;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private DecimalFormat decimalFormat = new DecimalFormat("###################.###########");
    /**
     * 累计计算的值
     */
    private Double computeResult=null;
    /**
     * 计算动作
     */
    private int action=ComputeAction.NONE;
    /**
     * 是否需要清空输入
     */
    private boolean clearInput=true;
    /**
     * 当前界面展示的值
     */
    private TextView tvResult;
    private TextView btnAc;
    private TextView btnThe;
    private TextView btnPercent;
    private TextView btnDivide;
    private TextView btnMultiplication;
    private TextView btnSubtraction;
    private TextView btnAdd;
    private TextView btnDot;
    private TextView btnEqual;
    private List<TextView> listNumber=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
    }
    //获取控件
    private void initView(){
        tvResult=findViewById(R.id.tv_result);//结果显示组件
        btnAc=findViewById(R.id.btn_ac);//清空按钮
        btnThe=findViewById(R.id.btn_the);//取反按钮
        btnPercent=findViewById(R.id.btn_percent);//百分比按钮
        btnDivide=findViewById(R.id.btn_divide);//除
        btnMultiplication=findViewById(R.id.btn_multiplication);//乘
        btnSubtraction=findViewById(R.id.btn_subtraction);//减
        btnAdd=findViewById(R.id.btn_add);//加
        btnEqual=findViewById(R.id.btn_equal);//等
        btnDot=findViewById(R.id.btn_dot);//小数点
        //数字按钮,放到List里
        listNumber.add(findViewById(R.id.btn_0));
        listNumber.add(findViewById(R.id.btn_1));
        listNumber.add(findViewById(R.id.btn_2));
        listNumber.add(findViewById(R.id.btn_3));
        listNumber.add(findViewById(R.id.btn_4));
        listNumber.add(findViewById(R.id.btn_5));
        listNumber.add(findViewById(R.id.btn_6));
        listNumber.add(findViewById(R.id.btn_7));
        listNumber.add(findViewById(R.id.btn_8));
        listNumber.add(findViewById(R.id.btn_9));
    }
    //绑定事件
    private void initListener(){
        //循环绑定数字按钮
        for(TextView btnNumber:listNumber) {
            btnNumber.setOnClickListener((View view)->{
                handleNumberClick(Integer.parseInt(btnNumber.getText().toString()));//数字输入
            });
        }
        btnAdd.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.ADD);
        });
        btnSubtraction.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.SUBTRACTION);
        });
        btnMultiplication.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.MULTIPLICATION);
        });
        btnDivide.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.DIVIDE);
        });
        btnEqual.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.EQUAL);
        });
        btnAc.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.AC);
        });
        btnPercent.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.PERCENT);
        });
        btnThe.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.THE);
        });
        btnDot.setOnClickListener((View view)->{
            handleComputeAction(ComputeAction.DOT);
        });
    }

    /**
     * 输入数字
     */
    private void handleNumberClick(Integer number){
        String strOldResult=tvResult.getText().toString();
        if(!clearInput) {
            //当前没有按下计算按钮,显示的数字累加即可
            if(strOldResult.equals("0")) {
                strOldResult="";
            }
            tvResult.setText(strOldResult+number.toString());
            clearInput=false;
            return;
        }
        tvResult.setText(number+"");
        clearInput=false;
    }

    /**
     * 输入运算符
     */
    private void handleComputeAction(int action) {
        activeBtn(action);//处理按钮点击激活效果

        String strOldResult=tvResult.getText().toString();//当前屏幕输入的值
        Double oldResult=Double.parseDouble(strOldResult);//当前屏幕输入的数值

        if(this.action==ComputeAction.NONE) {
            //不存在上一个动作 保存当前输入的值
            this.computeResult=oldResult;
        }
        if(action==ComputeAction.ADD || action==ComputeAction.SUBTRACTION ||action==ComputeAction.MULTIPLICATION ||action==ComputeAction.DIVIDE) {
            //加减乘除运算
            if(this.action==ComputeAction.NONE) {
                //不存在上一个动作 保存当前输入的值
                this.computeResult=oldResult;
            } else {
                //存在上一个动作,使用上一个动作计算一次
                this.computeResult=handleCompute(this.computeResult,oldResult,this.action);
                tvResult.setText(decimalFormat.format(computeResult));
            }
            this.action=action;
            clearInput=true;
        } else if(action==ComputeAction.EQUAL) {
            //等
            this.computeResult=handleCompute(this.computeResult,oldResult,this.action);
            tvResult.setText(decimalFormat.format(computeResult));
            this.action=ComputeAction.NONE;
            clearInput=true;
        } else if(action==ComputeAction.PERCENT) {
            //百分比
            this.computeResult=handlePercent(this.computeResult);
            tvResult.setText(decimalFormat.format(computeResult));
            this.action=ComputeAction.NONE;
        } else if(action==ComputeAction.THE) {
            //取反
            this.computeResult=-this.computeResult;
            tvResult.setText(decimalFormat.format(computeResult));
        } else if(action==ComputeAction.DOT){
            //小数点
            if(!strOldResult.contains(".")) {
                //加入小数点
                tvResult.setText(strOldResult+".");
            } else {
                //不处理
            }
        } else if(action==ComputeAction.AC) {
            //清空历史
            this.computeResult=0.0;
            tvResult.setText(decimalFormat.format(computeResult));
            this.action=ComputeAction.NONE;
            clearInput=true;
        }
    }

    /**
     * 计算操作
     */
    private Double handleCompute(Double oldNumber,Double number,int action){
        if(oldNumber==null) {
            oldNumber=0.0;
        }
        if(number==null) {
            number=0.0;
        }
        BigDecimal hisNumber=new BigDecimal(oldNumber);//历史结果
        BigDecimal newNumber=new BigDecimal(number);//输入结果
        BigDecimal result=new BigDecimal(0);
        if(action==ComputeAction.ADD) {
            //加
            result=hisNumber.add(newNumber);
        } else if(action==ComputeAction.SUBTRACTION) {
            //减
            result=hisNumber.subtract(newNumber);
        } else if(action==ComputeAction.MULTIPLICATION) {
            //乘
            result=hisNumber.multiply(newNumber);
        } else if(action==ComputeAction.DIVIDE) {
            //除
            result=hisNumber.divide(newNumber);
        } else if(action==ComputeAction.AC) {
            //ac
        } else if(action==ComputeAction.THE){
            //正反
        } else {
            result=hisNumber;
        }
        result=result.setScale(5,BigDecimal.ROUND_HALF_UP);
        return result.doubleValue();
    }

    /**
     * 百分比计算
     */
    private double handlePercent(Double number){
        return (new BigDecimal(number)).divide(new BigDecimal(100)).setScale(5,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    private void activeBtn(int action){
        int defColor=getColor(R.color.orange);
        btnDivide.setBackgroundColor(defColor);
        btnMultiplication.setBackgroundColor(defColor);
        btnSubtraction.setBackgroundColor(defColor);
        btnAdd.setBackgroundColor(defColor);

        if(action==ComputeAction.ADD) {
            //加
            btnAdd.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.SUBTRACTION) {
            //减
            btnSubtraction.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.MULTIPLICATION) {
            //乘
            btnMultiplication.setBackgroundColor(getColor(R.color.orange2));
        } else if(action==ComputeAction.DIVIDE) {
            //除
            btnDivide.setBackgroundColor(getColor(R.color.orange2));
        }
    }

}
啊~~~~~~~~~
最后更新于 2023-10-10