Android 简单的计算器实现
16lz
2021-01-23
android中实现一个简单的计算器,实现连续的加减乘除运算。
首先,让我们看下布局:
最上边是一个edittext 用来显示用户输入的运算数字和运算符,下面是一个TableLayout显示数字和运算符按钮。
话不多说,主要代码如下:
package com.easygoing.androidcalculator;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ListAdapter;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button bt_num0; private Button bt_num1; private Button bt_num2; private Button bt_num3; private Button bt_num4; private Button bt_num5; private Button bt_num6; private Button bt_num7; private Button bt_num8; private Button bt_num9; private Button bt_clear; private Button bt_percent; private Button bt_delete; private Button bt_div; private Button bt_mult; private Button bt_minus; private Button bt_plus; private Button bt_equal; private Button bt_dot; private EditText et_calc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViewAndListener(); } private void initViewAndListener() { bt_num0 = findViewById(R.id.bt_num0); bt_num0.setOnClickListener(this); bt_num1 = findViewById(R.id.bt_num1); bt_num1.setOnClickListener(this); bt_num2 = findViewById(R.id.bt_num2); bt_num2.setOnClickListener(this); bt_num3 = findViewById(R.id.bt_num3); bt_num3.setOnClickListener(this); bt_num4 = findViewById(R.id.bt_num4); bt_num4.setOnClickListener(this); bt_num5 = findViewById(R.id.bt_num5); bt_num5.setOnClickListener(this); bt_num6 = findViewById(R.id.bt_num6); bt_num6.setOnClickListener(this); bt_num7 = findViewById(R.id.bt_num7); bt_num7.setOnClickListener(this); bt_num8 = findViewById(R.id.bt_num8); bt_num8.setOnClickListener(this); bt_num9 = findViewById(R.id.bt_num9); bt_num9.setOnClickListener(this); bt_clear = findViewById(R.id.bt_clear); bt_clear.setOnClickListener(this); bt_percent = findViewById(R.id.bt_percent); bt_percent.setOnClickListener(this); bt_delete = findViewById(R.id.bt_delete); bt_delete.setOnClickListener(this); bt_div = findViewById(R.id.bt_div); bt_div.setOnClickListener(this); bt_mult = findViewById(R.id.bt_mult); bt_mult.setOnClickListener(this); bt_minus = findViewById(R.id.bt_minus); bt_minus.setOnClickListener(this); bt_plus = findViewById(R.id.bt_plus); bt_plus.setOnClickListener(this); bt_equal = findViewById(R.id.bt_equal); bt_equal.setOnClickListener(this); et_calc = findViewById(R.id.et_calc); bt_dot = findViewById(R.id.bt_dot); bt_dot.setOnClickListener(this); } private boolean lastIsOperator; private String lastOperators = ""; private List operatorNumbers = new ArrayList<>(); private List operators = new ArrayList<>();; private double firstNumber = 0D; private double sencondNumber = 0D; @Override public void onClick(View v) { String currentText = et_calc.getText().toString(); String operatorNumber = ""; if (currentText.equals("0")) { et_calc.setText(""); } operatorNumber = et_calc.getText().toString(); if(!lastOperators.equals("")) { int index = operatorNumber.lastIndexOf(lastOperators); operatorNumber = operatorNumber.substring(index+1); } switch (v.getId()) { case R.id.bt_num0: et_calc.setText(et_calc.getText() + "0"); lastIsOperator = false; break; case R.id.bt_num1: et_calc.setText(et_calc.getText() + "1"); lastIsOperator = false; break; case R.id.bt_num2: et_calc.setText(et_calc.getText() + "2"); lastIsOperator = false; break; case R.id.bt_num3: et_calc.setText(et_calc.getText() + "3"); lastIsOperator = false; break; case R.id.bt_num4: et_calc.setText(et_calc.getText() + "4"); lastIsOperator = false; break; case R.id.bt_num5: et_calc.setText(et_calc.getText() + "5"); lastIsOperator = false; break; case R.id.bt_num6: et_calc.setText(et_calc.getText() + "6"); lastIsOperator = false; break; case R.id.bt_num7: et_calc.setText(et_calc.getText() + "7"); lastIsOperator = false; break; case R.id.bt_num8: et_calc.setText(et_calc.getText() + "8"); lastIsOperator = false; break; case R.id.bt_num9: et_calc.setText(et_calc.getText() + "9"); lastIsOperator = false; break; case R.id.bt_dot: et_calc.setText(et_calc.getText() + "."); lastIsOperator = false; break; case R.id.bt_clear: et_calc.setText(""); lastIsOperator = false; firstNumber = 0D; sencondNumber = 0D; lastOperators ="="; break; case R.id.bt_percent: lastIsOperator = true; break; case R.id.bt_delete: if (TextUtils.isEmpty(et_calc.getText())) { return; } lastIsOperator = false; et_calc.setText(currentText.substring(0, currentText.length() - 1).length() > 0 ? currentText.substring(0, currentText.length() - 1) : "0"); break; case R.id.bt_div: if ((TextUtils.isEmpty(et_calc.getText()) || lastIsOperator) && !lastOperators.equals("=")) { return; } opratorCalc(operatorNumber,"÷"); lastIsOperator = true; et_calc.setText(et_calc.getText() + "÷"); lastOperators = "÷"; break; case R.id.bt_mult: if ((TextUtils.isEmpty(et_calc.getText()) || lastIsOperator) && !lastOperators.equals("=")) { return; } opratorCalc(operatorNumber,"*"); lastIsOperator = true; et_calc.setText(et_calc.getText() + "*"); lastOperators = "*"; break; case R.id.bt_minus: if ((TextUtils.isEmpty(et_calc.getText()) || lastIsOperator) && !lastOperators.equals("=")) { return; } opratorCalc(operatorNumber,"-"); lastIsOperator = true; et_calc.setText(et_calc.getText() + "-"); lastOperators = "-"; break; case R.id.bt_plus: if ((TextUtils.isEmpty(et_calc.getText()) || lastIsOperator) && !lastOperators.equals("=")) { return; } opratorCalc(operatorNumber,"+"); lastIsOperator = true; et_calc.setText(et_calc.getText() + "+"); lastOperators = "+"; break; case R.id.bt_equal: double result = 0D; if(TextUtils.isEmpty(lastOperators)) { return; } opratorResult(operatorNumber); sencondNumber = 0D; lastOperators ="="; lastIsOperator = true; et_calc.setText(et_calc.getText() + "\n=" + String.valueOf(firstNumber)); break; } } private void operate(String operatorNumber) { if(sencondNumber != 0D) { if(lastOperators.equals("÷")) { sencondNumber = sencondNumber / Double.parseDouble(operatorNumber); firstNumber = firstNumber / sencondNumber; } else if(lastOperators.equals("*")) { sencondNumber = sencondNumber * Double.parseDouble(operatorNumber); firstNumber = firstNumber * sencondNumber; } else if(lastOperators.equals("+")) { sencondNumber = Double.parseDouble(operatorNumber); firstNumber = firstNumber + sencondNumber; } else if(lastOperators.equals("-")) { sencondNumber = Double.parseDouble(operatorNumber); firstNumber = firstNumber - sencondNumber; } } else { if(lastOperators.equals("÷")) { firstNumber = firstNumber / Double.parseDouble(operatorNumber); } else if(lastOperators.equals("*")) { firstNumber = firstNumber * Double.parseDouble(operatorNumber); } else if(lastOperators.equals("+")) { firstNumber = firstNumber + Double.parseDouble(operatorNumber); } else if(lastOperators.equals("-")) { firstNumber= firstNumber - Double.parseDouble(operatorNumber); } } } public void opratorResult(String operatorNumber) { operate(operatorNumber); } public void opratorCalc(String operatorNumber,String currentOprator) { if(TextUtils.isEmpty(lastOperators)) { firstNumber = Double.parseDouble(operatorNumber); return; } if(lastOperators.equals(currentOprator)) { if(lastOperators.equals("÷")) { firstNumber = firstNumber / Double.parseDouble(operatorNumber); } else if(lastOperators.equals("*")) { firstNumber = firstNumber * Double.parseDouble(operatorNumber); } else if(lastOperators.equals("+")) { firstNumber = firstNumber + Double.parseDouble(operatorNumber); } else if(lastOperators.equals("-")) { firstNumber = firstNumber - Double.parseDouble(operatorNumber); } return; } operate(operatorNumber); }}```**重点内容**至于button的selector样式比较简单,这里简单贴出来两个:、"se-preview-section-delimiter">
普通button样式
<?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="com.easygoing.androidcalculator.MainActivity"> <EditText android:id="@+id/et_calc" style="@style/et_calc_style" /> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TableRow> <Button android:id="@+id/bt_clear" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="C"/> <Button android:id="@+id/bt_percent" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="+/-"/> <Button android:id="@+id/bt_delete" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="Del" /> <Button android:id="@+id/bt_div" style="@style/bt_styles_common" android:background="@drawable/btn_operate_background" android:textColor="#FFFFFF" android:text="÷"/> TableRow> <TableRow> <Button android:id="@+id/bt_num7" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="7"/> <Button android:id="@+id/bt_num8" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="8"/> <Button android:id="@+id/bt_num9" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="9"/> <Button android:id="@+id/bt_mult" style="@style/bt_styles_common" android:background="@drawable/btn_operate_background" android:textColor="#FFFFFF" android:text="×"/> TableRow> <TableRow> <Button android:id="@+id/bt_num4" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="4"/> <Button android:id="@+id/bt_num5" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="5"/> <Button android:id="@+id/bt_num6" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="6"/> <Button android:id="@+id/bt_minus" style="@style/bt_styles_common" android:background="@drawable/btn_operate_background" android:textColor="#FFFFFF" android:text="-"/> TableRow> <TableRow> <Button android:id="@+id/bt_num1" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="1"/> <Button android:id="@+id/bt_num2" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="2"/> <Button android:id="@+id/bt_num3" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="3"/> <Button android:id="@+id/bt_plus" style="@style/bt_styles_common" android:background="@drawable/btn_operate_background" android:textColor="#FFFFFF" android:text="+"/> TableRow> <TableRow> <Button android:id="@+id/bt_num0" style="@style/bt_styles_common" android:background="@drawable/btn_background" android:text="0"/> <Button android:id="@+id/bt_dot" style="@style/bt_styles_common" android:layout_weight="0.5" android:background="@drawable/btn_background" android:text="·"/> <Button android:id="@+id/bt_equal" style="@style/bt_styles_common" android:layout_weight="0.5" android:background="@drawable/btn_operate_background" android:textColor="#FFFFFF" android:text="="/> TableRow> TableLayout>LinearLayout>
这里需要注意的一点就是再按钮0的布局那里,需要设置一样权重,让按钮0能够占两个按钮的长度,
代码的逻辑比较简单,主要是记录三个操作数和两个运算符,当有两个运算符的时候,比较运算符的优先级,先行运算,然后保存计算结果,详细的可以看下代码。
当然了,这个计算器的功能不是很完善,这里只不过是进行一个简单的示例,有兴趣的可以自己做一个。。
源代码下载地址:http://download.csdn.net/download/qingyulove/10181313
更多相关文章
- 一个二维码实现IOS和android两个平台的下载核心代码
- Android-使用SoundPool实现语音计算器
- android背景选择器selector用法、自定义Button按钮样式.........
- [Android] 一份代码,两个版本
- 利用android studio制作简易的计算器
- android延迟执行任务(刷新按钮旋转)
- Android控件-多选按钮、单选按钮
- android Shape Drawable创建两边半圆的按钮背景【转】