Android
Android入门之简易计算器(二)
文章目录
前言
以下内容为简易版计算器,如有出错部分,欢迎指正。
提示:如果你们上Android课的老师也布置了作业让写建议计算器,那么下面代码可供参考(这是后端源码)
一、前端界面+源码
二、后端界面
1.后端逻辑
(1)先给按钮们设置点击事件监听,获取TextView的文本视图
重复步骤可以复制粘贴再更改相应按钮名称
监听事件代码如下:
// 从布局文件中获取名叫tv_result的文本视图
tv_result = findViewById(R.id.tv_result);
// 给每一个按钮注册点击事件监听
findViewById(R.id.btn_baifen).setOnClickListener(this);// 百分号
findViewById(R.id.ib_sqrt).setOnClickListener(this);// 开平方
findViewById(R.id.btn_clear).setOnClickListener(this); // 清除
findViewById(R.id.ib_huitui).setOnClickListener(this);// 回退
findViewById(R.id.btn_seven).setOnClickListener(this);// 7
findViewById(R.id.btn_eight).setOnClickListener(this);// 8
findViewById(R.id.btn_nine).setOnClickListener(this);// 9
findViewById(R.id.btn_minus).setOnClickListener(this);// 减法
findViewById(R.id.btn_four).setOnClickListener(this);// 4
findViewById(R.id.btn_five).setOnClickListener(this);// 5
findViewById(R.id.btn_six).setOnClickListener(this);// 6
findViewById(R.id.btn_plus).setOnClickListener(this);// 加法
findViewById(R.id.btn_one).setOnClickListener(this);// 1
findViewById(R.id.btn_two).setOnClickListener(this);// 2
findViewById(R.id.btn_three).setOnClickListener(this);// 3
findViewById(R.id.btn_divide).setOnClickListener(this);// 除法
findViewById(R.id.btn_zero).setOnClickListener(this);// 0
findViewById(R.id.btn_dot).setOnClickListener(this);// 小数点
findViewById(R.id.btn_equal).setOnClickListener(this);// 等号
findViewById(R.id.btn_multiply).setOnClickListener(this);// 乘法
(2)点击ImageButton和普通Button不一样
进行判断区分
区分代码如下:
// 如果是开根号的按钮
if (v.getId() == R.id.ib_sqrt){
inputText = "√";
}else{
// 除了开根号之外的其他按钮,把本来是Button的按钮都转成TextView
// 获取输入内容
inputText = ((TextView)v).getText().toString();
}
(3)对按钮分类
对不同的按钮进行分类,不同的按钮使用不同的方法
分类代码如下:
switch (v.getId()){
// 点击了清除按钮
case R.id.btn_clear:
break;
// 点击了回退(取消)按钮
case R.id.ib_huitui:
break;
// 点击了加、减、乘、除按钮
case R.id.btn_plus:// 加
case R.id.btn_minus: // 减
case R.id.btn_multiply:// 乘
case R.id.btn_divide:// 除
break;
// 点击了等号按钮
case R.id.btn_equal:
break;
// 点击了开根号按钮
break;
// 点击了求余数按钮
case R.id.btn_baifen:
break;
// 点击了其他按钮,包括数字小数点
default:
break;
}
(3)定义变量
对于后续要用到的变量(操作数、操作符)进行定义
变量代码如下:
//第一个操作数5+6=0,5就是第一个操作数
private String firstNum = "";
// 运算符,初始化一个空字符串
private String operator = "";
// 第二个操作数,6就是第二个操作数
private String secondNum = "";
// 当前的计算结果,0就是计算结果
private String result = "";
// 显示的文本内容
private String showText = "";
(4)对于操作数和运算符的判断
有运算符和无运算符的做法不一样,这里进行一下判断(在default里面写)
判断代码如下:
if (operator.equals("")){
firstNum = firstNum + inputText;
}else {
secondNum = secondNum + inputText;
}
(5)0和小数点的拼接和刷新
如果输入0再输入一个数,则不需要拼接,如08,那就要显示8就行,如果有小数点再显示0
整数不需要前面的0
判断的代码如下:
if (showText.equals("0") && !inputText.equals(".")){
refreshText(inputText);
}else {
refreshText(showText + inputText);
}
(6)创建四则运算的方法
加减乘除四则运算,返回计算结果
运算符号在strings.xml里,可以去里面复制粘贴到这里
四则运算代码如下:
private double calculateFour() {
switch (operator){
case "+":
return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
case "-":
return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
case "×":
return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
default:
return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
}
}
(7)刷新文本显示的方法
对于显示在TextView里的结果,创建一个刷新方法
刷新文本显示的代码如下:
private void refreshOperate(String new_result){
result = new_result;// 保存本次运算的结果
firstNum = result;
secondNum = "";// 等着用户输入
operator = "";// 等着用户输入
}
(8)刷新文本显示的方法
对于显示在TextView里的结果,创建一个刷新方法
刷新文本显示的代码如下:
private void refreshText(String text){
// 为什么要把传进来的text全局存起来?因为下一次新的内容要追加放在这个text上面
showText = text;//全局变量
tv_result.setText(showText);
}
(9)刷新运算结果,让操作符也为空
对于显示在TextView里的结果,创建一个刷新方法
刷新运算结果的代码如下:
private void refreshOperate(String new_result){
result = new_result;// 保存本次运算的结果
firstNum = result;
secondNum = "";// 等着用户输入
operator = "";// 等着用户输入
}
(10)清空并初始化的方法
让显示界面为空
清空并初始化的代码如下:
private void clear() {
refreshOperate("");
refreshText("");// 让显示界面为空
}
(11)对于等号按钮进行的操作
加减乘除四则运算
清空并初始化的代码如下:
case R.id.btn_equal:
double calculate_result = calculateFour();// 创建四则运算的方法
refreshOperate(String.valueOf(calculate_result));// 更新结果为下一次运算做准备
refreshText(showText + "=" + result);
break;
(11)对于开根号按钮进行的操作
开根号代码中用"√"代替(打出对勾的拼音,在输入法里面找到对勾的样式就行了)
开根号的代码如下:
case R.id.ib_sqrt:
double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
refreshOperate(String.valueOf(sqrt_result));// 更新结果为下一次运算做准备
refreshText(showText + "√=" + result);
break;
(11)对于求余按钮进行的操作
求余的代码中添加try/catch抛出异常
求余的代码如下:
case R.id.btn_baifen:
try {
double baifen_result = Double.parseDouble(firstNum) % Double.parseDouble(secondNum);
refreshOperate(String.valueOf(baifen_result));// 更新结果为下一次运算做准备
refreshText(showText + "=" + result);
}catch (NumberFormatException e){
e.printStackTrace();
}
break;
三、后端页面总代码
package com.example.fjrcalculator;
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 operator = "";
private String secondNum = "";
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_baifen).setOnClickListener(this);// 百分号
findViewById(R.id.ib_sqrt).setOnClickListener(this);// 开平方
findViewById(R.id.btn_clear).setOnClickListener(this); // 清除
findViewById(R.id.ib_huitui).setOnClickListener(this);// 回退
findViewById(R.id.btn_seven).setOnClickListener(this);// 7
findViewById(R.id.btn_eight).setOnClickListener(this);// 8
findViewById(R.id.btn_nine).setOnClickListener(this);// 9
findViewById(R.id.btn_minus).setOnClickListener(this);// 减法
findViewById(R.id.btn_four).setOnClickListener(this);// 4
findViewById(R.id.btn_five).setOnClickListener(this);// 5
findViewById(R.id.btn_six).setOnClickListener(this);// 6
findViewById(R.id.btn_plus).setOnClickListener(this);// 加法
findViewById(R.id.btn_one).setOnClickListener(this);// 1
findViewById(R.id.btn_two).setOnClickListener(this);// 2
findViewById(R.id.btn_three).setOnClickListener(this);// 3
findViewById(R.id.btn_divide).setOnClickListener(this);// 除法
findViewById(R.id.btn_zero).setOnClickListener(this);// 0
findViewById(R.id.btn_dot).setOnClickListener(this);// 小数点
findViewById(R.id.btn_equal).setOnClickListener(this);// 等号
findViewById(R.id.btn_multiply).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.ib_huitui:
break;
case R.id.btn_plus: // 加
case R.id.btn_minus: // 减
case R.id.btn_multiply: // 乘
case R.id.btn_divide: // 除
operator = inputText;
refreshText(showText + operator);
break;
case R.id.btn_equal:
double calculate_result = calculateFour();refreshOperate(String.valueOf(calculate_result));
refreshText(showText + "=" + result);
break;
case R.id.ib_sqrt:
double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
refreshOperate(String.valueOf(sqrt_result));
refreshText(showText + "√=" + result);
break;
case R.id.btn_baifen:
try {
double baifen_result = Double.parseDouble(firstNum) % Double.parseDouble(secondNum);
refreshOperate(String.valueOf(baifen_result));
refreshText(showText + "=" + result);
}catch (NumberFormatException e){
e.printStackTrace();
}
break;
default:
if(result.length() > 0 && operator.equals("")) {
clear();
}
if (operator.equals("")){
firstNum = firstNum + inputText;
}else {
secondNum = secondNum + inputText;
}
if (showText.equals("0") && !inputText.equals(".")){
refreshText(inputText);
}else {
refreshText(showText + inputText);
}
break;
}
}
private double calculateFour() {
switch (operator){
case "+":
return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
case "-":
return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
case "×":
return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
default:
return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
}
}
private void clear() {
refreshOperate("");
refreshText("");
}
private void refreshOperate(String new_result){
result = new_result;
firstNum = result;
secondNum = "";
operator = "";
}
private void refreshText(String text){
showText = text;
tv_result.setText(showText);
}
}
前端页面代码:Android入门之简易计算器(一)
总结
提示:本代码对于简单的运算尚且满足,再复杂点的就会出现崩溃闪退现象,毕竟是简易版计算器和平时手机电脑使用的科学计算器还是不能比的。
以上就是今天要讲的内容,本文仅仅简单介绍了简易版计算器后端代码内容,还是存在一些小小的bug,但是对于交作业是足够了。