以下实验是利用逍遥模拟器搭建的简易计算器页面
对现有功能说明:可实现双目运算和开方单目运算;
待改进:需要实现表达式的计算;以及负数参与运算;
//XML代码<?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"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">//线性布局--方向垂直//第一行是标题“计算器”TextView//第二行是编辑框“EditText”//线性布局//放置计算器的按钮<LinearLayoutandroid:id="@+id/linearLayout"android:layout_width="0dp"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@string/calculator"android:textSize="20sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/textView2"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="end"android:text="@string/zero"android:textSize="30sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/textView" /></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:gravity="center_horizontal"android:orientation="horizontal"app:layout_constraintStart_toStartOf="@+id/linearLayout"app:layout_constraintTop_toTopOf="parent"><!-- app:layout_constraintTop_toBottomOf="@+id/et_input">--><!-- C按钮--><Buttonandroid:id="@+id/clr"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="C"android:textSize="30sp"/><!-- 删除CE按钮--><Buttonandroid:id="@+id/del"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="CE"android:textSize="30sp"/><!-- 开方运算按钮--><Buttonandroid:id="@+id/sqrt"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="√"android:textSize="30sp"/><!-- 加运算+按钮--><Buttonandroid:id="@+id/add"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="+"android:textSize="30sp"/></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout3"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="160dp"android:gravity="center_horizontal"android:orientation="horizontal"app:layout_constraintStart_toStartOf="@+id/linearLayout"app:layout_constraintTop_toTopOf="parent"><!-- 数字1--><Buttonandroid:id="@+id/btn_1"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="1"android:textSize="30sp"/><!-- 数字2--><Buttonandroid:id="@+id/btn_2"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="2"android:textSize="30sp"/><!-- 数字3--><Buttonandroid:id="@+id/btn_3"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="3"android:textSize="30sp"/><!-- 减运算-按钮--><Buttonandroid:id="@+id/minus"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="-"android:textSize="30sp"/></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="220dp"android:gravity="center_horizontal"android:orientation="horizontal"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><!-- 数字4--><Buttonandroid:id="@+id/btn_4"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="4"android:textSize="30sp"/><!-- 数字5--><Buttonandroid:id="@+id/btn_5"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="5"android:textSize="30sp"/><!-- 数字6--><Buttonandroid:id="@+id/btn_6"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="6"android:textSize="30sp"/><!-- 乘运算*按钮--><Buttonandroid:id="@+id/mul"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="*"android:textSize="30sp"/></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout5"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="280dp"android:gravity="center_horizontal"android:orientation="horizontal"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><!-- 数字7--><Buttonandroid:id="@+id/btn_7"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="7"android:textSize="30sp"/><!-- 数字8--><Buttonandroid:id="@+id/btn_8"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="8"android:textSize="30sp"/><!-- 数字9--><Buttonandroid:id="@+id/btn_9"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="9"android:textSize="30sp"/><!-- 除/运算--><Buttonandroid:id="@+id/div"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="/"android:textSize="30sp"/></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout6"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="340dp"android:gravity="center_horizontal"android:orientation="horizontal"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><!-- 小数点--><Buttonandroid:id="@+id/dot"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="."android:textSize="30sp"/><!-- 数字0--><Buttonandroid:id="@+id/btn_0"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="0"android:textSize="30sp"/><!-- 负数取值--><Buttonandroid:id="@+id/negative"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="±"android:textSize="30sp"/><!-- 等于=按钮--><Buttonandroid:id="@+id/equal"android:layout_width="80dp"android:layout_height="60dp"android:paddingRight="15sp"android:paddingBottom="15sp"android:text="="android:textSize="30sp"/></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
//MainActivity.javapackage com.example.exp2;import static android.util.Log.println;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.Lifecycle;public class MainActivity extends AppCompatActivity {//数字按钮的idint[] ids = {R.id.btn_0, R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4, R.id.btn_5, R.id.btn_6, R.id.btn_7, R.id.btn_8, R.id.btn_9};//Button数组Button[] nums = new Button[10];Button add, minus, mul, div, sqrt, eq, clr, del, dot, negative;//结果栏TextView display;//枚举变量 State--状态自动机enum State {CLEAR, NUM1, NUM2, RESULT};State S = State.CLEAR; //附初始默认状态值,防止空指针出现导致出现keep stopping问题;double number1, number2;//定义op 判断运算类型int op = -1;View.OnClickListener num_proc = new View.OnClickListener() {@Override//实现多位数字显示public void onClick(View view) {String s;switch (S) {case CLEAR:CLEAR_NUM1(); //数字键相应->变成状态NUM1s = ((TextView) view).getText().toString(); //得到第一个数字按钮文字display.setText(s); //显示到文本框break;case NUM1:case NUM2:s = display.getText().toString(); //从源结果框取出原内容if (s == "0") {s = ((TextView) view).getText().toString();//如果原文本框是0,显示内容即可} else {s += ((TextView) view).getText().toString(); //加上新添加的内容}display.setText(s); //重新显示到结果框break;case RESULT:break;default:;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过id找到对应的控件add = findViewById(R.id.add);minus = findViewById(R.id.minus);mul = findViewById(R.id.mul);div = findViewById(R.id.div);sqrt = findViewById(R.id.sqrt);eq = findViewById(R.id.equal);clr = findViewById(R.id.clr);del = findViewById(R.id.del);dot = findViewById(R.id.dot);negative = findViewById(R.id.negative);display = findViewById(R.id.textView2); //第二个显示框显示计算结果;for (int i = 0; i < 10; i++) {nums[i] = findViewById(ids[i]);nums[i].setOnClickListener(num_proc); //给每个数字按键添加监视器;}//dot添加监听器dot.setOnClickListener(num_proc);
// negative添加监听器
// negative.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
//
// }
// };//clr添加监听器clr.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {to_CLEAR();//State置CLEAR;}});//del后退_添加监听器del.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String str = display.getText().toString();if ((str.length()) == 1) {display.setText("0");} else {display.setText(str.substring(0, str.length() - 1));}}});//add添加监听器;add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:break;case NUM1:NUM1_NUM2();//此时状态是NUM2String temp_1 = display.getText().toString();number1 = Double.valueOf(temp_1);display.append("+");op = 1;break;case NUM2:case RESULT:break;default:;}}});//minus添加监听器;minus.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:break;case NUM1:NUM1_NUM2();//此时状态是NUM2String temp_1 = display.getText().toString();number1 = Double.valueOf(temp_1);display.append("-");op = 2;break;case NUM2:case RESULT:break;default:;}}});//mul添加监听器;mul.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:break;case NUM1:NUM1_NUM2();//此时状态是NUM2String temp_1 = display.getText().toString();number1 = Double.valueOf(temp_1);display.append("x");op = 3;break;case NUM2:case RESULT:break;default:;}}});//div添加监听器;div.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:break;case NUM1:NUM1_NUM2();String temp_1 = display.getText().toString();number1 = Double.valueOf(temp_1);display.append("/");op = 4;break;case NUM2:case RESULT:break;default:;}}});//sqrt添加监听器;sqrt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:CLEAR_NUM1();NUM1_NUM2();display.setText("√");op = 5;break;case NUM1:case NUM2:case RESULT:break;default:;}}});//eq添加监视器eq.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (S) {case CLEAR:break;case NUM1:break;case NUM2:NUM2_RESULT();String temp = display.getText().toString();int index;String temp_2;double end = 0;if (op == 1) {index = temp.indexOf("+");temp_2 = temp.substring(index + 1);number2 = Double.valueOf(temp_2);end = number1 + number2;} else if (op == 2) {index = temp.indexOf("-");temp_2 = temp.substring(index + 1);number2 = Double.valueOf(temp_2);end = number1 - number2;} else if (op == 3) {index = temp.indexOf("x");temp_2 = temp.substring(index + 1);number2 = Double.valueOf(temp_2);end = number1 * number2;} else if (op == 4) {index = temp.indexOf("/");temp_2 = temp.substring(index + 1);number2 = Double.valueOf(temp_2);end = number1 / number2;} else if (op == 5) {// Log.d(TestApp,temp2);index = temp.indexOf("√");temp_2 = temp.substring(index + 1);number2 = Double.valueOf(temp_2);end = Math.sqrt(number2);}if (end == Math.floor(end)) {display.setText(String.valueOf((int) end) + "");} else {display.setText(end + "");}break;case RESULT:break;default:;}}});}void to_CLEAR() {S = State.CLEAR;display.setText("0");}void CLEAR_NUM1() {S = State.NUM1;}void NUM1_NUM2() {S = State.NUM2;}void NUM2_RESULT() {S = State.RESULT;}
}