当前位置: 首页 > article >正文

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

学了一些Android的简单控件,用这些布局和控件,设计并实现一个简单计算器。

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

按照计算器App的效果图,大致分布着下列Android控件:

  • 线性布局LinearLayout:因为计算器界面整体从上往下布局,所以需要垂直方向的LinearLayout。
  • 网格布局GridLayout:计算器下半部分的几排按钮,正好成五行四列表格分布,适合采用 GridLayout。
  • 滚动视图ScrollView:虽然计算器界面不宽也不高,但是以防万一,最好还是加个垂直方向的 ScrollView。
  • 文本视图TextView:很明显顶部标题“简单计算器”就是TextView,且文字居中显示;标题下面的计 算结果也需要使用TextView,且文字靠右靠下显示。
  • 按钮Button:几乎所有的数字与运算符按钮都采用了Button控件。
  • 图像按钮ImageButton:开根号的运算符“√”虽然能够打出来,但是右上角少了数学课本上的一横, 所以该按钮要显示一张标准的开根号图片,这用到了ImageButton。

在这里插入图片描述

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


http://www.kler.cn/news/367921.html

相关文章:

  • 代码随想录算法训练营第46期
  • 全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家
  • redis缓存和业务应用了解
  • 强大!Spring Boot 3.3 集成 PDFBox 轻松实现电子签章功能!
  • 【AI换装整合及教程】CatVTON:时尚与科技的完美融合
  • 卷积神经网络评价指标
  • 详细且系统的Spring Boot应用开发
  • 还没想好说什么
  • 【负二进制】个人练习-Leetcode-1073. Adding Two Negabinary Numbers
  • 从零开始:用Spring Boot搭建厨艺分享网站
  • Linux:指令再认识
  • 使用 Python 实现智能地震预警系统
  • Python画笔案例-094 绘制 神奇彩条动画
  • 【报错】FastGPT本地部署通义千问,报错undefined 当前分组 default 下对于模型 qwen:7b 无可用渠道 【搭建企业级知识库问答系统】
  • 视觉工具与C#联合开发图片格式转换
  • 猫头虎 分享已解决Bug || RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED 解决方案
  • 第十一部分 Java 数据结构及集合
  • 速盾:高防cdn怎么拦截恶意ip?
  • Matlab数字图像处理——基于形态学处理的硬币计数系统(含m文件和GUI)
  • 华为原生鸿蒙操作系统的发布有何重大意义和影响:
  • PHP-FPM 性能配置优化
  • 面试宝典(四):Java8的新特性
  • Android 应用申请 Google MBA权限
  • Vue2 关于指令
  • 【PHP】ThinkPHP获取请求的域名及前缀
  • 直播系统源码技术搭建部署流程及配置步骤