赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:Kotlin版本+Java版本
这学期学习了Android开发,写的第一个小项目就是简易计算器。原本只写了kotlin版本,放假后加了Java版本,在此记录下。
计算器的功能包括【加减乘除、求余】,功能比较简单,所以是简易计算器。
计算器效果如图:
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#1a1c21" tools:context=".MainActivity"> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_begin="167dp" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_begin="261dp" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <TextView android: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" /> <ImageView android: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>
package com.example.my_counter import 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.ActivityMainBinding class MainActivity : AppCompatActivity() { private val currentInputNumString = StringBuilder() private val numbersList = mutableListOf<Double>() private val operatorsList = mutableListOf<String>() private val dotsList = mutableListOf(false) private var isNumStart = true private lateinit var processTextView: TextView private lateinit var resultTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) processTextView = binding.processTextView resultTextView = binding.resultTextView } fun numberButtonClicked(view: View) { val tv = view as TextView if (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 TextView val 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 = true dotsList.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 = true dotsList.clear() dotsList.add(false) } fun delButtonClicked(view: View) { val myOperators = listOf('+', '-', '×', '÷', '%') // 若输入串为NULL,则不进行操作 if (currentInputNumString.isNotEmpty()) { if (currentInputNumString[currentInputNumString.length - 1] in myOperators) { isNumStart = false dotsList.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 TextView if (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.0 var i = 0 var temp = 0.0 val numStr = StringBuilder() val firstOperators = listOf("×", "÷", "%") val operators = listOf('×', '÷', '%', '+', '-') // 构造numbersList、operatorsList numbersList.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 = 0 while (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] = temp numbersList.removeAt(i) } else { i++ } } // 进行加减运算 i = 0 resNum = 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 = true for (a in ii + 1 until resStr.length) { if (resStr[a] != '0') { flagInt = false break } } 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 } } }
提示:其实两个版本的布局文件都差不多,只是颜色和背景有区别而已。 直接用Kotlin版本的activity_main.xml,再修改下颜色、背景即可。
代码如下:
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; @Override protected 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(); } }); } @Override public 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、operatorsList numbersList.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主来,后来发现效果不是我想要的,就自己改了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。