以下实验是利用逍遥模拟器搭建的简易计算器页面
对现有功能说明:可实现双目运算和开方单目运算;
待改进:需要实现表达式的计算;以及负数参与运算;
//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”
//线性布局
//放置计算器的按钮
<LinearLayout
android: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">
<TextView
android: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" />
<TextView
android: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>
<LinearLayout
android: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按钮-->
<Button
android:id="@+id/clr"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="C"
android:textSize="30sp"/>
<!-- 删除CE按钮-->
<Button
android:id="@+id/del"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="CE"
android:textSize="30sp"/>
<!-- 开方运算按钮-->
<Button
android:id="@+id/sqrt"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="√"
android:textSize="30sp"/>
<!-- 加运算+按钮-->
<Button
android:id="@+id/add"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="+"
android:textSize="30sp"/>
</LinearLayout>
<LinearLayout
android: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-->
<Button
android: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-->
<Button
android: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-->
<Button
android:id="@+id/btn_3"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="3"
android:textSize="30sp"/>
<!-- 减运算-按钮-->
<Button
android:id="@+id/minus"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="-"
android:textSize="30sp"/>
</LinearLayout>
<LinearLayout
android: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-->
<Button
android: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-->
<Button
android: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-->
<Button
android:id="@+id/btn_6"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="6"
android:textSize="30sp"/>
<!-- 乘运算*按钮-->
<Button
android:id="@+id/mul"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="*"
android:textSize="30sp"/>
</LinearLayout>
<LinearLayout
android: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-->
<Button
android: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-->
<Button
android: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-->
<Button
android:id="@+id/btn_9"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="9"
android:textSize="30sp"/>
<!-- 除/运算-->
<Button
android:id="@+id/div"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="/"
android:textSize="30sp"/>
</LinearLayout>
<LinearLayout
android: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">
<!-- 小数点-->
<Button
android:id="@+id/dot"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="."
android:textSize="30sp"/>
<!-- 数字0-->
<Button
android:id="@+id/btn_0"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="0"
android:textSize="30sp"/>
<!-- 负数取值-->
<Button
android:id="@+id/negative"
android:layout_width="80dp"
android:layout_height="60dp"
android:paddingRight="15sp"
android:paddingBottom="15sp"
android:text="±"
android:textSize="30sp"/>
<!-- 等于=按钮-->
<Button
android: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.java
package 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 {
//数字按钮的id
int[] 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(); //数字键相应->变成状态NUM1
s = ((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:
;
}
}
};
@Override
protected 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() {
@Override
public void onClick(View view) {
to_CLEAR();//State置CLEAR;
}
});
//del后退_添加监听器
del.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(View view) {
switch (S) {
case CLEAR:
break;
case NUM1:
NUM1_NUM2();//此时状态是NUM2
String 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() {
@Override
public void onClick(View view) {
switch (S) {
case CLEAR:
break;
case NUM1:
NUM1_NUM2();//此时状态是NUM2
String 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() {
@Override
public void onClick(View view) {
switch (S) {
case CLEAR:
break;
case NUM1:
NUM1_NUM2();//此时状态是NUM2
String 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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;
}
}