【Android】简易计算器

article/2025/11/2 9:40:34

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Android简易计算器

  • 前言
  • 一、Kotlin版本
    • 1. activity_main.xml
    • 2. MainActivity.kt
  • 二、Java版本
    • 1. activity_main.xml
    • 2. MainActivity.java
  • 总结


前言

提示:Kotlin版本+Java版本

这学期学习了Android开发,写的第一个小项目就是简易计算器。原本只写了kotlin版本,放假后加了Java版本,在此记录下。

计算器的功能包括【加减乘除、求余】,功能比较简单,所以是简易计算器。


计算器效果如图:

简易计算器

一、Kotlin版本

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:id="@+id/main_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#1a1c21"tools:context=".MainActivity"><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_begin="167dp" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_begin="261dp" /><TextViewandroid:id="@+id/process_text_view"android:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="20dp"android:layout_marginEnd="20dp"android:gravity="bottom|end"android:letterSpacing="0.1"android:text="16x16"android:textColor="#f4f0f2"android:textSize="25sp"app:layout_constraintBottom_toTopOf="@+id/guideline1"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" /><TextViewandroid:id="@+id/result_text_view"android:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="20dp"android:layout_marginEnd="20dp"android:gravity="end|center_vertical"android:letterSpacing="0.1"android:text="196"android:textColor="@color/white"android:textSize="30sp"app:layout_constraintBottom_toTopOf="@+id/guideline2"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline1" /><TextViewandroid:id="@+id/btn_view"android:layout_width="0dp"android:layout_height="0dp"android:background="@drawable/top_round_shape"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/result_text_view"app:layout_constraintVertical_bias="0.0" /><TextViewandroid:id="@+id/mod_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="operatorButtonClicked"android:text="@string/percent"android:textColor="#d74b51"android:textSize="25sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/div_view"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_M"app:layout_constraintTop_toBottomOf="@+id/result_text_view" /><TextViewandroid:id="@+id/view_M"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="mButtonClicked"android:text="@string/M"android:textColor="#29d1b2"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_9"app:layout_constraintEnd_toStartOf="@+id/mod_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/del_view"app:layout_constraintTop_toBottomOf="@+id/result_text_view" /><TextViewandroid:id="@+id/view_7"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_7"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_4"app:layout_constraintEnd_toStartOf="@+id/view_8"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/ac_view" /><TextViewandroid:id="@+id/view_8"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_8"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_5"app:layout_constraintEnd_toStartOf="@+id/view_9"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_7"app:layout_constraintTop_toBottomOf="@+id/del_view" /><TextViewandroid:id="@+id/view_4"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_4"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_1"app:layout_constraintEnd_toStartOf="@+id/view_5"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/view_7" /><TextViewandroid:id="@+id/view_1"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_1"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_0"app:layout_constraintEnd_toStartOf="@+id/view_2"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/view_4" /><TextViewandroid:id="@+id/view_0"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_0"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toStartOf="@+id/dot_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/view_1" /><TextViewandroid:id="@+id/view_3"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_3"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/equal_view"app:layout_constraintEnd_toStartOf="@+id/add_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_2"app:layout_constraintTop_toBottomOf="@+id/view_6" /><TextViewandroid:id="@+id/view_5"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_5"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_2"app:layout_constraintEnd_toStartOf="@+id/view_6"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_4"app:layout_constraintTop_toBottomOf="@+id/view_8" /><TextViewandroid:id="@+id/equal_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="equalButtonClicked"android:text="@string/equal"android:textColor="#ffff00"android:textSize="30sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toStartOf="@+id/sub_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/dot_view"app:layout_constraintTop_toBottomOf="@+id/view_3" /><TextViewandroid:id="@+id/dot_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="dotButtonClicked"android:text="@string/dot"android:textColor="@color/white"android:textSize="30sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toStartOf="@+id/equal_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_0"app:layout_constraintTop_toBottomOf="@+id/view_2" /><TextViewandroid:id="@+id/add_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="operatorButtonClicked"android:text="@string/add"android:textColor="#d74b51"android:textSize="35sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/sub_view"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_3"app:layout_constraintTop_toBottomOf="@+id/mul_view" /><TextViewandroid:id="@+id/sub_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="operatorButtonClicked"android:text="@string/sub"android:textColor="#d74b51"android:textSize="35sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/equal_view"app:layout_constraintTop_toBottomOf="@+id/add_view" /><TextViewandroid:id="@+id/view_2"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_2"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/dot_view"app:layout_constraintEnd_toStartOf="@+id/view_3"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_1"app:layout_constraintTop_toBottomOf="@+id/view_5" /><TextViewandroid:id="@+id/mul_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="operatorButtonClicked"android:text="@string/mul"android:textColor="#d74b51"android:textSize="35sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/add_view"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_6"app:layout_constraintTop_toBottomOf="@+id/div_view" /><TextViewandroid:id="@+id/view_6"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_6"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_3"app:layout_constraintEnd_toStartOf="@+id/mul_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_5"app:layout_constraintTop_toBottomOf="@+id/view_9" /><TextViewandroid:id="@+id/ac_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="clearButtonClicked"android:text="@string/AC"android:textColor="#29d1b2"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_7"app:layout_constraintEnd_toStartOf="@+id/del_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/result_text_view" /><TextViewandroid:id="@+id/view_9"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="numberButtonClicked"android:text="@string/num_9"android:textColor="@color/white"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_6"app:layout_constraintEnd_toStartOf="@+id/div_view"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_8"app:layout_constraintTop_toBottomOf="@+id/view_M" /><TextViewandroid:id="@+id/div_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="operatorButtonClicked"android:text="@string/div"android:textColor="#d74b51"android:textSize="35sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/mul_view"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/view_9"app:layout_constraintTop_toBottomOf="@+id/mod_view" /><TextViewandroid:id="@+id/del_view"android:layout_width="80dp"android:layout_height="80dp"android:background="@drawable/round_shape"android:gravity="center"android:onClick="delButtonClicked"android:text="@string/Del"android:textColor="#29d1b2"android:textSize="22sp"android:textStyle="bold"app:layout_constraintBottom_toTopOf="@+id/view_8"app:layout_constraintEnd_toStartOf="@+id/view_M"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@+id/ac_view"app:layout_constraintTop_toBottomOf="@+id/result_text_view" /><ImageViewandroid:id="@+id/lightMode"android:layout_width="60dp"android:layout_height="60dp"android:layout_marginTop="5dp"android:layout_marginEnd="5dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:srcCompat="@drawable/mode_ic" />
</androidx.constraintlayout.widget.ConstraintLayout>

2. MainActivity.kt

package com.example.my_counterimport android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.my_counter.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {private val currentInputNumString = StringBuilder()private val numbersList = mutableListOf<Double>()private val operatorsList = mutableListOf<String>()private val dotsList = mutableListOf(false)private var isNumStart = trueprivate lateinit var processTextView: TextViewprivate lateinit var resultTextView: TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)processTextView = binding.processTextViewresultTextView = binding.resultTextView}fun numberButtonClicked(view: View) {val tv = view as TextViewif (currentInputNumString.toString() == "0") {currentInputNumString.clear()}// 更新text view内容currentInputNumString.append(tv.text)processTextView.text = currentInputNumString.toString()if (isNumStart) {isNumStart = false}}fun operatorButtonClicked(view: View) {val tv = view as TextViewval myOperators = listOf('+', '-', '×', '÷', '%')val digits = listOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')// 如果前一个符号为运算符,则更换运算符when {currentInputNumString[currentInputNumString.length - 1] in myOperators -> {currentInputNumString.deleteCharAt(currentInputNumString.length - 1)currentInputNumString.append(tv.text)}currentInputNumString[currentInputNumString.length - 1] in digits -> {// 如果前一个符号为数字currentInputNumString.append(tv.text.toString())processTextView.text = currentInputNumString.toString()isNumStart = truedotsList.add(false)}else -> {Toast.makeText(this, "此刻不能添加${tv.text}!", Toast.LENGTH_SHORT).show()}}processTextView.text = currentInputNumString.toString()Log.v("myTag", "$operatorsList")}fun clearButtonClicked(view: View) {currentInputNumString.clear()currentInputNumString.append("0")processTextView.text = currentInputNumString.toString()// 重置列表、参数isNumStart = truedotsList.clear()dotsList.add(false)}fun delButtonClicked(view: View) {val myOperators = listOf('+', '-', '×', '÷', '%')// 若输入串为NULL,则不进行操作if (currentInputNumString.isNotEmpty()) {if (currentInputNumString[currentInputNumString.length - 1] in myOperators) {isNumStart = falsedotsList.removeLast()} else if (currentInputNumString[currentInputNumString.length - 1] == '.') {dotsList[dotsList.size - 1] = false} else {if (currentInputNumString.length >= 2 && currentInputNumString[currentInputNumString.length - 2] in myOperators) {isNumStart = true//dotsList.removeLast()} else if(currentInputNumString.length == 1){isNumStart = true}}currentInputNumString.deleteCharAt(currentInputNumString.length - 1)processTextView.text = currentInputNumString.toString()}}fun dotButtonClicked(view: View) {if (!dotsList[dotsList.size - 1]) {val tv = view as TextViewif (currentInputNumString.isEmpty()) {currentInputNumString.append("0")}currentInputNumString.append(tv.text.toString())processTextView.text = currentInputNumString.toString()dotsList[dotsList.size - 1] = true}}fun equalButtonClicked(view: View) {if (currentInputNumString.isEmpty()) {resultTextView.text = "0"return}var resNum = 0.0var i = 0var temp = 0.0val numStr = StringBuilder()val firstOperators = listOf("×", "÷", "%")val operators = listOf('×', '÷', '%', '+', '-')// 构造numbersList、operatorsListnumbersList.clear()operatorsList.clear()while (i < currentInputNumString.length) {if (currentInputNumString[i] in operators) {numbersList.add(numStr.toString().toDouble())operatorsList.add(currentInputNumString[i].toString())numStr.clear()} else {numStr.append(currentInputNumString[i])}i++}if (numStr.isNotEmpty()) {numbersList.add(numStr.toString().toDouble())} else {operatorsList.removeLast()}// 进行乘除运算i = 0while (i < operatorsList.size) {if (operatorsList[i] in firstOperators) {when (operatorsList[i]) {"×" -> temp = numbersList[i] * numbersList[i + 1]"÷" -> temp = numbersList[i] / numbersList[i + 1]"%" -> temp = numbersList[i] % numbersList[i + 1]}operatorsList.removeAt(i)numbersList[i + 1] = tempnumbersList.removeAt(i)} else {i++}}// 进行加减运算i = 0resNum = numbersList[i]numbersList.removeAt(0)while (i < operatorsList.size) {if (operatorsList[i] == "+") {resNum += numbersList[i]} else {resNum -= numbersList[i]}i++}// 显示结果val resStr = resNum.toString()val ii = resStr.indexOf('.')var flagInt = truefor (a in ii + 1 until resStr.length) {if (resStr[a] != '0') {flagInt = falsebreak}}if (flagInt) {    // 显示整数resultTextView.text = resNum.toInt().toString()} else {  // 显示浮点数resultTextView.text = resNum.toString()}Log.v("myTag", "$numbersList")Log.v("myTag", "$operatorsList")}fun mButtonClicked(view: View) {// 更新显示processTextView.text = resultTextView.text// 更新字符串currentInputNumString.clear()currentInputNumString.append(resultTextView.text.toString())// 重置dotsList列表dotsList.clear()dotsList.add(false)// 标记是否数字开头isNumStart = false// 判断是否为小数val numStr = resultTextView.text.toString()val i = numStr.indexOf('.')if (i > 0) {dotsList[0] = true}}
}

二、Java版本

1. activity_main.xml

提示:其实两个版本的布局文件都差不多,只是颜色和背景有区别而已。 直接用Kotlin版本的activity_main.xml,再修改下颜色、背景即可。

2. MainActivity.java

代码如下:

package com.example.zhangskin;import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import com.zhy.changeskin.SkinManager;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class MainActivity extends com.zhy.changeskin.base.BaseSkinActivity implements View.OnClickListener {private int signal = 0;private final StringBuilder currentInputNumString = new StringBuilder();private final ArrayList<Double> numbersList = new ArrayList<>();private final ArrayList<String> operatorsList = new ArrayList<>();private final ArrayList<Boolean> dotsList = new ArrayList<>();private Boolean isNumStart = true;private TextView processTextView;private TextView resultTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 换肤第三方库注册,可直接注释掉SkinManager.getInstance().init(this);dotsList.add(false);processTextView = findViewById(R.id.process_text_view);resultTextView = findViewById(R.id.result_text_view);// 绑定监听事件findViewById(R.id.view_0).setOnClickListener(this);findViewById(R.id.view_1).setOnClickListener(this);findViewById(R.id.view_2).setOnClickListener(this);findViewById(R.id.view_3).setOnClickListener(this);findViewById(R.id.view_4).setOnClickListener(this);findViewById(R.id.view_5).setOnClickListener(this);findViewById(R.id.view_6).setOnClickListener(this);findViewById(R.id.view_7).setOnClickListener(this);findViewById(R.id.view_8).setOnClickListener(this);findViewById(R.id.view_9).setOnClickListener(this);findViewById(R.id.view_M).setOnClickListener(this);findViewById(R.id.ac_view).setOnClickListener(this);findViewById(R.id.del_view).setOnClickListener(this);findViewById(R.id.add_view).setOnClickListener(this);findViewById(R.id.sub_view).setOnClickListener(this);findViewById(R.id.mul_view).setOnClickListener(this);findViewById(R.id.div_view).setOnClickListener(this);findViewById(R.id.mod_view).setOnClickListener(this);findViewById(R.id.dot_view).setOnClickListener(this);findViewById(R.id.equal_view).setOnClickListener(this);// bringToFront()让控件始终在最顶层,不被覆盖                     findViewById(R.id.lightMode).bringToFront();// 换肤操作,可直接注释掉findViewById(R.id.lightMode).setOnClickListener(view -> {if(signal == 0){signal = 1;SkinManager.getInstance().changeSkin("night");}else{signal = 0;SkinManager.getInstance().removeAnySkin();}});}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.view_0:case R.id.view_1:case R.id.view_2:case R.id.view_3:case R.id.view_4:case R.id.view_5:case R.id.view_6:case R.id.view_7:case R.id.view_8:case R.id.view_9:numberButtonClicked(view);break;case R.id.add_view:case R.id.sub_view:case R.id.mul_view:case R.id.div_view:case R.id.mod_view:operatorButtonClicked(view);break;case R.id.ac_view:clearButtonClicked(view);break;case R.id.del_view:delButtonClicked(view);break;case R.id.view_M:mButtonClicked(view);break;case R.id.dot_view:dotButtonClicked(view);break;case R.id.equal_view:equalButtonClicked(view);break;default:break;}}public void numberButtonClicked(View v){TextView tv = (TextView) v;if (currentInputNumString.toString().equals("0")) {currentInputNumString.delete(0,currentInputNumString.length());}// 更新text view内容currentInputNumString.append(tv.getText());processTextView.setText(currentInputNumString.toString());if (isNumStart) {isNumStart = false;}}public void operatorButtonClicked(View view) {TextView tv = (TextView) view;List<Character> myOperators = Arrays.asList('+', '-', '×', '÷', '%');List<Character> digits = Arrays.asList('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');// 如果前一个符号为运算符,则更换运算符if(myOperators.contains(currentInputNumString.charAt(currentInputNumString.length() - 1))) {currentInputNumString.deleteCharAt(currentInputNumString.length() - 1);currentInputNumString.append(tv.getText());}else if(digits.contains(currentInputNumString.charAt(currentInputNumString.length() - 1))){// 如果前一个符号为数字currentInputNumString.append(tv.getText().toString());processTextView.setText(currentInputNumString.toString());isNumStart = true;dotsList.add(false);}else {Toast.makeText(this, "此刻不能添加${tv.getText()}!", Toast.LENGTH_SHORT).show();}processTextView.setText(currentInputNumString.toString());}public void clearButtonClicked(View view) {currentInputNumString.delete(0,currentInputNumString.length());currentInputNumString.append("0");processTextView.setText(currentInputNumString.toString());// 重置列表、参数isNumStart = true;dotsList.clear();dotsList.add(false);}public void delButtonClicked(View view) {List<Character> myOperators = Arrays.asList('+', '-', '×', '÷', '%');// 若输入串为NULL,则不进行操作if (currentInputNumString.length()>0) {char temp = currentInputNumString.charAt(currentInputNumString.length() - 1);if (myOperators.contains(temp)) {isNumStart = false;dotsList.remove(dotsList.size()-1);//dotsList.removeLast();} else if ('.' == currentInputNumString.charAt(currentInputNumString.length() - 1)) {dotsList.set(dotsList.size() - 1, false);} else {if (currentInputNumString.length() >= 2 &&myOperators.contains(currentInputNumString.charAt(currentInputNumString.length() - 2))) {isNumStart = true;} else if(currentInputNumString.length() == 1){isNumStart = true;}}currentInputNumString.deleteCharAt(currentInputNumString.length() - 1);processTextView.setText(currentInputNumString.toString());}}public void dotButtonClicked(View view) {if (!dotsList.get(dotsList.size() - 1)) {TextView tv = (TextView) view;if (currentInputNumString.length() == 0) {currentInputNumString.append("0");}currentInputNumString.append(".");processTextView.setText(currentInputNumString.toString());dotsList.set(dotsList.size() - 1, true);}}public void mButtonClicked(View view) {// 更新显示processTextView.setText(resultTextView.getText());// 更新字符串currentInputNumString.delete(0,currentInputNumString.length());currentInputNumString.append(resultTextView.getText().toString());// 重置dotsList列表dotsList.clear();dotsList.add(false);// 标记是否数字开头isNumStart = false;// 判断是否为小数String numStr = resultTextView.getText().toString();int i = numStr.indexOf('.');if (i > 0) {dotsList.set(0, true);}}public void equalButtonClicked(View view) {if (currentInputNumString.length() == 0 ) {resultTextView.setText("0");return;}double resNum = 0.0;int i = 0;double temp = 0.0;StringBuilder numStr = new StringBuilder();List<String> firstOperators = Arrays.asList("×", "÷", "%");List<Character> operators = Arrays.asList('×', '÷', '%', '+', '-');// 构造numbersList、operatorsListnumbersList.clear();operatorsList.clear();while (i < currentInputNumString.length()) {if (operators.contains(currentInputNumString.charAt(i))) {numbersList.add(Double.parseDouble(numStr.toString()));operatorsList.add(Character.toString(currentInputNumString.charAt(i)));numStr.delete(0,numStr.length());} else {numStr.append(currentInputNumString.charAt(i));}i++;}if (numStr.length()>0) {numbersList.add(Double.parseDouble(numStr.toString()));} else {operatorsList.remove(operatorsList.size()-1);}// 进行乘除运算i = 0;while (i < operatorsList.size()) {if (firstOperators.contains(operatorsList.get(i))){switch (operatorsList.get(i)) {case "×":temp = numbersList.get(i) * numbersList.get(i + 1);break;case "÷":temp = numbersList.get(i) / numbersList.get(i + 1);break;case "%":temp = numbersList.get(i) % numbersList.get(i + 1);break;}operatorsList.remove(i);numbersList.set(i+1,temp);numbersList.remove(i);} else {i++;}}// 进行加减运算i = 0;resNum = numbersList.get(i);numbersList.remove(0);while (i < operatorsList.size()) {if (operatorsList.get(i).equals("+")) {resNum += numbersList.get(i);} else {resNum -= numbersList.get(i);}i++;}// 显示结果String resStr = Double.toString(resNum);int ii = resStr.indexOf('.');boolean flagInt = true;for (int a = ii + 1;a < resStr.length();a++) {if (resStr.charAt(a) != '0') {flagInt = false;break;}}if (flagInt) {    // 显示整数resultTextView.setText(String.valueOf((int)resNum));} else {  // 显示浮点数resultTextView.setText(String.valueOf(resNum));}}
}

总结

计算器的界面,是我参照B站上一个up主的讲解视频完成的,至于逻辑完成的代码,原本也是照着up主来,后来发现效果不是我想要的,就自己改了。


http://chatgpt.dhexx.cn/article/jJVMJwts.shtml

相关文章

Android 计算器

Android 计算器 开发环境&#xff1a;android stdio 3.6.1 最终效果&#xff1a; 竖屏&#xff1a; 横屏&#xff1a; 完整项目&#xff1a;百度网盘链接 密码 v89n 主要代码&#xff1a; MainActivity.java: package com.example.experience_two;import androidx.appc…

android计算器

1、效果预览 2、项目布局 3、main.xml文件内容 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"fill_parent"android:layout_height"fi…

Android计算器简单实现及代码分析

一、UI布局及代码 页面效果 布局代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

Android计算器——入门

Android计算器—入门 作者&#xff1a;黑衣侠客 一.前言 这是我写的第一个App&#xff0c;利用的是《安卓第一行代码》第三章&#xff0c;UI控件的一些知识&#xff0c;然后整体结构综合了一些CSDN博客和简书上的一些著作&#xff0c;同样&#xff0c;在写Android计算器&…

基础复习——项目练习——计算器

布局&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:background"#eeeeee"android:orientation"vert…

安卓-AndroidStudio-计算器

安卓--Android Studio--简易计算器 结果截图关键代码讲解完整代码 本人是一名在校学生&#xff0c;由于上个学期的课程内容包括移动开发&#xff0c;其中的实验也算是大部分是自己完成的&#xff0c;所以算是写博客记录一下吧。 第一次写&#xff0c;有啥问题及时交流哈&#x…

Django数据库操作

目录 一、Django/ORM框架介绍及配置 1.1、ORM框架介绍 1.2、Django数据库配置 二、定义模型类数 2.1、定义模型类 2.2、迁移 2.3、插入数据 三、单表据库操作(增、删、改、查) 3.1、增 3.2、删 3.3、改 3.4查&#xff08;重点&#xff09; 四、两表联查 4.1、一对…

Qt入门------数据库操作

文章目录 一、数据库1.数据库驱动2.查询驱动3.连接数据库4.执行sql语句5.插入数据6.事务 二 &#xff0c;sql模型类1.QSqlQueryModel模型2.QSqlTableModel模型3.QSqlRelationalTableModel模型 一、数据库 Qt中的Qt SQL模块提供了对数据库的支持&#xff0c;模块中类可分为三层…

Java的数据库操作

Java的数据库操作&#xff0c;上学期末的课设是用到的&#xff0c;然而老师把JDBC连接mysql数据库的代码和配置文件已经给好了&#xff0c;那时对它可以说是只有一点点印象。 今天跟着书走一边敲一边&#xff0c;总算是有所进步。 数据库表的创建和初始数据的操作&#xff0c…

一文详解python中的数据库操作

python中的数据库操作 一、数据库编程接口1. 连接对象 二、使用内置的SQLite1.创建数据库文件2.操作SQLite 三、MySql数据库的使用3.1 安装MySql3.2 设置环境变量3.3 启动MySql3.4 使用navicat for mysql 管理软件3.5 安装PyMysql模块3.6 连接数据库 四、创建数据表4.1 创建boo…

数据库操作练习题

如何查看员工表中的所有字段&#xff1f; 如何查看员工表中的姓名和性别&#xff1f; 如何知道每个员工一年的总收入&#xff1f; 怎么查看女员工的信息&#xff1f; 如何查看月薪范围位于 8000 到 12000 之间的员工&#xff1f; 查询员工中叫做“张三”、“李四” 或“张飞”的…

MySQL(一)数据库操作

1.关系型数据库与非关系型数据库区别与联系 1.关系型数据库 ( SQL ) MySQL , Oracle , SQL Server , SQLite , DB2 , … 关系型数据库通过外键关联来建立表与表之间的关系 2.非关系型数据库 ( NOSQL ) Redis , MongoDB , … 非关系型数据库通常指数据以对象的形式存储在数据…

使用ORACLE 进行数据库操作

上一期讲了 如何创建表&#xff0c;例如我们创建了一个 名为 t_customer 的表&#xff0c;格式为下&#xff1a; create table t_customer(cust_id int primary key,cust_name varchar(20),cust_gender char(3),cust_age int,cust_birthday date,cust_height number(3,2),cust…

C#数据库操作

功能需求 1&#xff0c;利用随机数模拟产生每次考试成绩 2&#xff0c;将每次考试成绩存入到数据库 3&#xff0c;将每次考试成绩划分优、良、中、差、不及格五类&#xff0c;并作为查询条件&#xff0c;查询符合每种水平的成绩 技术知识点 1.random类的使用 2.数据库的链…

云数据库操作

1 云数据库创建 每一个list就相当于一个表&#xff0c;每个记录就是一条内容 云数据库存储形式是JSON2 读取云数据库值 数据库初始化 const db wx.cloud.database() 连接数据库 db.collection(需要连接的数据列表名)可以通过.doc(‘具体id号’)获取具体的信息内容获取年、月…

Android数据库操作

Android内置了一个名为SQLite的关系型数据库&#xff0c;这是一款轻量型的数据库&#xff0c;操作十分简便。SQLite与别的数据库不同的是&#xff0c;它没有数据类型。可以保存任何类型的数据到你所想要保存的任何表的任何列中。但它又支持常见的类型比如: NULL, VARCHAR, TEXT…

数据库基本操作

一、数据库基本操作 1.数据库的基本操作 -- 1.数据库的基本操作 使用test数据库 USE test; -- 查看当前test数据库中所有表 MySQL命令 SHOW TABLES; -- 查表的基本信息 SHOW CREATE TABLE student; -- -- 查看表的字段信息 desc student; 2.数据表的基本操作 -- 2.数据表的…

数据库基础操作

一、数据库的操作 数据库与客户端是通过网络进行交互的。 1、显示当前数据库 sql语句必须以 ; 结尾 show databases; 2、创建数据库 create database 数据库名; ->如果数据库sql敲错了&#xff0c;会有提示。 ->如果sql敲错了&#xff0c;可以按 ctrlc来终止sql。…

数据库的基本操作

目录 一、数据库的基本操作 1、数据库的登录及退出 2、查看所有数据库 3、显示数据库版本 4、显示时间 5、创建数据库 6、查看创建数据库的语句 7、查看当前使用的数据库 8、查看当前用户 9、使用某个数据库 10、删除数据库 二、数据表的基本操作 1、查看当前数据…

如何在IDEA上创建一个JSP项目【亲测有效】

idea上创建一个jsp项目 1、创建一个Java项目 2、创建成功后右击项目名称&#xff0c;点击Add Framework support 3、选择web application 选择适合版本&#xff0c;创建 4、创建成功后项目中会出现web文件夹 5、点击属性&#xff0c;进行配置 6、在project中配置jdk(你自己电脑…