小秦哥 发表于 2024-12-22 01:16:03

Android简朴控件实现简易计算器

学了一些Android的简朴控件,用这些布局和控件,计划并实现一个简朴计算器。
计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键,例如:从0到9的数字按钮、加减乘除与等号、正负号按钮、小数点 按钮、求倒数按钮、平方按钮、开方按钮,以及退格、清空、取消等控制按钮。通过这些按键操纵,能 够实现整数和小数的四则运算,以及求倒数、求平方、求开方等简朴运算
按照计算器App的效果图,大致分布着下列Android控件:


[*]线性布局LinearLayout:由于计算器界面团体从上往下布局,所以需要垂直方向的LinearLayout。
[*]网格布局GridLayout:计算器下半部分的几排按钮,正好成五行四列表格分布,适合采用 GridLayout。
[*]滚动视图ScrollView:固然计算器界面不宽也不高,但是以防万一,最好照旧加个垂直方向的 ScrollView。
[*]文本视图TextView:很显着顶部标题“简朴计算器”就是TextView,且文字居中表现;标题下面的计 算结果也需要使用TextView,且文字靠右靠下表现。
[*]按钮Button:几乎所有的数字与运算符按钮都采用了Button控件。
[*]图像按钮ImageButton:开根号的运算符“√”固然能够打出来,但是右上角少了数学课本上的一横, 所以该按钮要表现一张标准的开根号图片,这用到了ImageButton。
https://i-blog.csdnimg.cn/direct/3810d7ccd05b4f67b5e348a2c803f00c.png
CalculatorActivity.java
package com.example.chapter03;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tv_result;
    private String firstNum = ""; // 记录第一个操作数
    private String secondNum = ""; // 记录第二个操作数
    private String operator = ""; // 记录运算符
    private String result = ""; // 记录运算结果
    private String showText = ""; // 记录显示文本

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_calculator);
      tv_result = findViewById(R.id.tv_result);
      // 给每个按钮控件注册点击监听器
      findViewById(R.id.btn_clear).setOnClickListener(this);
      findViewById(R.id.btn_cancel).setOnClickListener(this);
      findViewById(R.id.btn_plus).setOnClickListener(this);
      findViewById(R.id.btn_minus).setOnClickListener(this);
      findViewById(R.id.btn_multiply).setOnClickListener(this);
      findViewById(R.id.btn_reciprocal).setOnClickListener(this);
      findViewById(R.id.btn_equal).setOnClickListener(this);
      findViewById(R.id.ib_sqrt).setOnClickListener(this);
      findViewById(R.id.btn_divide).setOnClickListener(this);
      findViewById(R.id.btn_zero).setOnClickListener(this);
      findViewById(R.id.btn_one).setOnClickListener(this);
      findViewById(R.id.btn_two).setOnClickListener(this);
      findViewById(R.id.btn_three).setOnClickListener(this);
      findViewById(R.id.btn_four).setOnClickListener(this);
      findViewById(R.id.btn_five).setOnClickListener(this);
      findViewById(R.id.btn_six).setOnClickListener(this);
      findViewById(R.id.btn_seven).setOnClickListener(this);
      findViewById(R.id.btn_eight).setOnClickListener(this);
      findViewById(R.id.btn_nine).setOnClickListener(this);
      findViewById(R.id.btn_dot).setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
      String inputText;
      if (v.getId() == R.id.ib_sqrt) {
            inputText = "√";
      } else {
            inputText = ((TextView) v).getText().toString();
      }
      switch (v.getId()) {
            // 清除
            case R.id.btn_clear:
                clear();
                break;
            case R.id.btn_cancel:
                if (!showText.equals("")) {
                  showText = showText.substring(0, showText.length() - 1);
                  if (operator.equals("")) {
                        firstNum = showText;
                  } else {
                        secondNum = showText;
                  }
                  refreshResult(showText);
                }
                break;
            case R.id.btn_plus:
            case R.id.btn_minus:
            case R.id.btn_multiply:
            case R.id.btn_divide:
                if (firstNum.equals("")) {
                  firstNum = "0";
                }
                operator = inputText;
                refreshResult(showText + inputText);
                break;
            case R.id.btn_equal:
                double calculate_result = calculateFour();
                if (calculate_result == 0) {
                  result = showText;
                } else {
                  refreshOperate(String.valueOf(calculate_result));
                  refreshResult(showText + "=" + result);
                }

                break;
            case R.id.ib_sqrt:
                if (operator.equals("")) {
                  double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
                  refreshOperate(String.valueOf(sqrt_result));
                  refreshResult("√" + firstNum + "=" + result);
                } else {
                  double sqrt_result = Math.sqrt(Double.parseDouble(secondNum));
                  secondNum = String.valueOf(sqrt_result);
                  refreshResult(firstNum + operator + secondNum);
                }
                break;
            case R.id.btn_reciprocal:
                double reciprocal_result = 1 / Double.parseDouble(firstNum);
                refreshOperate(String.valueOf(reciprocal_result));
                refreshResult("1/" + showText + "=" + result);
                break;
            default:
                // 数字键
                if ((result.contains("Error")) || (!result.equals("") && operator.equals(""))) {
                  clear();
                }
                if (operator.equals("")) {
                  firstNum += inputText;
                } else {
                  secondNum += inputText;
                }
                if (showText.equals("0") && !inputText.equals(".")) {
                  refreshResult(inputText);
                } else {
                  refreshResult(showText + inputText);
                }
                break;
      }

    }

    private double calculateFour() {
      if (secondNum.equals("")) {
            secondNum = "0";
      }
      switch (operator) {
            case "+":
                return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
            case "-":
                return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
            case "x":
                return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
            case "÷":
                if (Double.parseDouble(secondNum) == 0) {
                  clear();
                  tv_result.setText("Error: 除数不能为0");
                  return 0;
                }
                return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
      }
      return 0;
    }

    // 清除
    private void clear() {
      refreshOperate("");
      refreshResult("");
      firstNum = "";
      secondNum = "";
      operator = "";
      result = "";
      showText = "";
    }

    // 刷新运算结果
    private void refreshOperate(String new_result) {
      result = new_result;
      firstNum = result;
      secondNum = "";
      operator = "";
    }

    // 刷新文本显示
    private void refreshResult(String text) {
      showText = text;
      tv_result.setText(showText);
    }
}
代码:Calculator.java,res/layout/activity_calculator.xml

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android简朴控件实现简易计算器