Android实战(一)—— 简单计算器

核心思想:
监听按钮的onClick()

  1. 获取按下的按钮上的String
  2. 然后对数字、小数点、运算符、根号、等号、C、CE、做出不同的响应
  3. 每次运算都要进行刷新操作数和运算符,设置计算框的操作
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_result;     // 结果框
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_result = findViewById(R.id.tv_result);
        // 文本移动方式为滚动
        tv_result.setMovementMethod(new ScrollingMovementMethod());

......
    }

    @Override
    public void onClick(View v) {
        String inputText;
        int resid = v.getId();

        // 根号
        if (resid == R.id.ib_sqrt) {
            inputText = "√";
        } else {
            inputText = ((TextView) v).getText().toString();
        }
        Log.d(TAG, "resid = " + resid + " , inputText=" + inputText);


        if (resid == R.id.btn_clear) {
            // C
            clear("");
            Toast.makeText(this, "归零", Toast.LENGTH_SHORT).show();
        } else if (resid == R.id.btn_cancel) {
            // CE
            if (operator.equals("")) {
                // 没有操作符,逐位取消前一个操作数
                if (firstNum.length() == 1) {
                    firstNum = "0";
                } else if (firstNum.length() > 0) {
                    firstNum = firstNum.substring(0, firstNum.length() - 1);
                } else {
                    Toast.makeText(this, "没有可以取消的数字", Toast.LENGTH_SHORT).show();
                    return;
                }
                showText = firstNum;
            } else {
                // 有操作符,逐位取消后一个数字
                if (nextNum.length() == 1) {
                    nextNum = "";
                } else if (nextNum.length() > 0) {
                    nextNum = nextNum.substring(0, nextNum.length() - 1);
                } else {
                    Toast.makeText(this, "运算符不可取消", Toast.LENGTH_SHORT).show();
                    return;
                }
                showText = showText.substring(0, showText.length() - 1);
            }
            tv_result.setText(showText);
        } else if (resid == R.id.btn_equal) {
            // =
            if (operator.length() == 0 || operator.equals("=")) {
                Toast.makeText(this, "请输入运算符", Toast.LENGTH_SHORT).show();
                return;
            } else if (nextNum.length() <= 0) {
                Toast.makeText(this, "要输入第二个数才能运算", Toast.LENGTH_SHORT).show();
                return;
            }
            if (calculate()) {
                operator = inputText;
                showText = showText + "=" + result;
                tv_result.setText(showText);
            } else {
                return;
            }
        } else if (resid == R.id.btn_plus || resid == R.id.btn_minus || resid == R.id.btn_multiply || resid == R.id.btn_divide) {
            // +-*/
            if (firstNum.length() <= 0) {
                Toast.makeText(this, "先输入数字再输入运算符", Toast.LENGTH_SHORT).show();
                return;
            }
            if (operator.length() == 0 || operator.equals("=") || operator.equals("√")) {
                operator = inputText;
                showText += operator;
                tv_result.setText(showText);
            } else {
                Toast.makeText(this, "不支持连续运算,请输入数字", Toast.LENGTH_SHORT).show();
                return;
            }
        } else if (resid == R.id.ib_sqrt) {
            // √
            if (firstNum.length() <= 0) {
                Toast.makeText(this, "先输入数字才能开根号", Toast.LENGTH_SHORT).show();
                return;
            }
            if (Double.parseDouble(firstNum) < 0) {
                Toast.makeText(this, "开根号的数值不能为负数", Toast.LENGTH_SHORT).show();
                return;
            }
            result = String.valueOf(Math.sqrt(Double.parseDouble(firstNum)));
            firstNum = result;
            nextNum = "";
            operator = inputText;
            showText = showText + "√=" + result;
            tv_result.setText(showText);
            Log.d(TAG, "result = " + result + " ,firstNum = " + firstNum + " ,operator = " + operator);
        } else {
            // 数字和小数点
            if (operator.equals("=")) {
                operator = "";
                firstNum = "";
                showText = "";
            }
            if (resid == R.id.btn_dot) {
                inputText = ".";
            }
            if (operator.equals("")){
                if(firstNum.contains(".") && inputText.equals(".")){
                    return;
                }
                firstNum += inputText;
            }else {
                if(nextNum.contains(".") && inputText.equals(".")){
                    return;
                }
                nextNum += inputText;
            }
            showText += inputText;
            tv_result.setText(showText);
        }
        return;
    }

    private boolean calculate() {
        switch (operator) {
            case "+":
                result = Arith.add(firstNum, nextNum);
                break;
            case "-":
                result = Arith.sub(firstNum, nextNum);
                break;
            case "×":
                result = Arith.mul(firstNum, nextNum);
                break;
            case "÷":
                if (Double.parseDouble(nextNum) == 0) {
                    Toast.makeText(this, "被除数不能为0", Toast.LENGTH_SHORT).show();
                    return false;
                } else {
                    result = Arith.div(firstNum, nextNum);
                }
                break;
        }
        Log.d(TAG, "result = " + result);
        firstNum = result;
        nextNum = "";
        return true;
    }

    private String showText = "";   // 显示的文本内容
    private String firstNum = "";   // 前一个操作数
    private String nextNum = "";    // 后一个操作数
    private String result = "";     // 当前计算结果
    private String operator = "";   // 操作符

    private void clear(String text) {
        showText = text;
        tv_result.setText(showText);
        operator = "";
        firstNum = "";
        nextNum = "";
        result = "";
    }
}

实现效果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章