提示:代码是完整的,可以直接复制到AndroidStudio运行。
1.activity_main.xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:layout_marginTop="50dp" android:background="#FFFFFF">
<TextView android:id="@+id/display" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="48sp" android:textColor="#000000" android:gravity="end" android:background="#FFFFFF" android:padding="24dp" android:layout_marginBottom="24dp" android:layout_alignParentTop="true"/>
<GridLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/display" android:rowCount="5" android:columnCount="4" android:padding="8dp" android:background="#FFFFFF">
<Button android:id="@+id/button7" android:text="7" style="@style/ButtonStyle"/>
<Button android:id="@+id/button8" android:text="8" style="@style/ButtonStyle"/>
<Button android:id="@+id/button9" android:text="9" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonDivide" android:text="/" style="@style/ButtonStyle"/>
<Button android:id="@+id/button4" android:text="4" style="@style/ButtonStyle"/>
<Button android:id="@+id/button5" android:text="5" style="@style/ButtonStyle"/>
<Button android:id="@+id/button6" android:text="6" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonMultiply" android:text="*" style="@style/ButtonStyle"/>
<Button android:id="@+id/button1" android:text="1" style="@style/ButtonStyle"/>
<Button android:id="@+id/button2" android:text="2" style="@style/ButtonStyle"/>
<Button android:id="@+id/button3" android:text="3" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonMinus" android:text="-" style="@style/ButtonStyle"/>
<Button android:id="@+id/button0" android:text="0" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonClear" android:text="C" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonEqual" android:text="=" style="@style/ButtonStyle"/>
<Button android:id="@+id/buttonPlus" android:text="+" style="@style/ButtonStyle"/>
</GridLayout>
</RelativeLayout>
2.MainActivity.java文件
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Stack;
import java.util.Stack;
public class MainActivity extends AppCompatActivity {
private TextView display;
private StringBuilder currentInput;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
display=findViewById(R.id.display);
currentInput = new StringBuilder();
setUpButtonClickListeners();
}
private void setUpButtonClickListeners() {
int[] buttonIds = {
R.id.button0, R.id.button1, R.id.button2,
R.id.button3, R.id.button4, R.id.button5,
R.id.button6, R.id.button7, R.id.button8,
R.id.button9, R.id.buttonPlus, R.id.buttonMinus,
R.id.buttonMultiply, R.id.buttonDivide, R.id.buttonClear,
R.id.buttonEqual
};
for (int buttonId : buttonIds) {
Button button = findViewById(buttonId);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onButtonClick((Button) v);
}
});
}
}
private void onButtonClick(Button button) {
String buttonText = button.getText().toString();
switch (buttonText) {
case "C":
currentInput.setLength(0); // 清空输入
break;
case "=":
calculateResult();
return;
default:
currentInput.append(buttonText); // 添加按钮文本到当前输入
break;
}
display.setText(currentInput.toString()); // 显示当前输入
}
private void calculateResult() {
String input = currentInput.toString();
if (!input.isEmpty()) {
try {
// 在这里,你可以使用第三方库(如 exp4j)或自己实现的解析算法来计算结果
// 这里为了示例,简单实现了一些基本的计算
double result = evaluateExpression(input);
display.setText(String.valueOf(result));
} catch (Exception e) {
display.setText("Error");
}
}
currentInput.setLength(0); // 清空输入
}
private double evaluateExpression(String expression) {
Stack<Double> values = new Stack<>(); // 数值堆栈
Stack<Character> operators = new Stack<>(); // 运算符堆栈
for (int i = 0; i < expression.length(); i++) {
char token = expression.charAt(i);
// 当前字符是一个数字,读取整个数字
if (Character.isDigit(token)) {
StringBuilder number = new StringBuilder();
while (i < expression.length() && (Character.isDigit(expression.charAt(i)) || expression.charAt(i) == '.')) {
number.append(expression.charAt(i++));
}
values.push(Double.parseDouble(number.toString()));
i--; // 回退一个位置
}
// 当前字符是一个运算符
else if (token == '+' || token == '-' || token == '*' || token == '/') {
// 确保运算符优先级
while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(token)) {
values.push(applyOperation(operators.pop(), values.pop(), values.pop()));
}
operators.push(token);
}
// 处理任何括号(如果实现扩展功能)
}
// 完成所有运算
while (!operators.isEmpty()) {
values.push(applyOperation(operators.pop(), values.pop(), values.pop()));
}
return values.pop();
}
// 运算符优先级
private int precedence(char operator) {
switch (operator) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
}
return 0;
}
// 应用运算符
private double applyOperation(char operator, double b, double a) {
switch (operator) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if (b == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return a / b;
}
return 0;
}
}
3.style.xml文件(要放在res目录下的values包)
<resources>
<!-- 定义一个名为 ButtonStyle 的样式 -->
<style name="ButtonStyle" parent="Widget.AppCompat.Button">
<!-- 自定义按钮的属性 -->
<!-- 设置按钮的背景颜色为固定颜色 -->
<item name="android:background">#FF3C0C</item>
<!-- 红色 -->
<!-- 设置按钮的文本颜色为固定颜色 -->
<item name="android:textColor">#FF3C0C</item>
<!-- 白色 -->
<item name="android:textSize">18sp</item>
<!-- 添加其他你想要的样式属性 -->
</style>
</resources>
4.最终的运行页面
代码是完全可以运行的,可以基于这个简单的模版,选择自己喜欢的样式进行修改。