package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.example.myapplication.databinding.ActivityMainBinding;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private String currentInput = "";
private String expression = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// 设置所有按钮的点击监听
setButtonListeners();
}
private void setButtonListeners() {
// 所有按钮ID数组
int[] buttonIds = {
R.id.btn0, R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4,
R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9,
R.id.btnAdd, R.id.btnSubtract, R.id.btnMultiply, R.id.btnDivide,
R.id.btnDot, R.id.btnPercent, R.id.btnPlusMinus, R.id.btnClear,
R.id.btnDelete, R.id.btnEquals
};
View.OnClickListener listener = v -> {
// 获取按钮文本(安全处理 null)
String text = ((TextView) v).getText().toString();
if (v.getId() == R.id.btnClear) {
currentInput = "";
expression = "";
binding.textViewHistory.setText("");
binding.editTextDisplay.setText("0");
} else if (v.getId() == R.id.btnDelete) {
if (!currentInput.isEmpty()) {
currentInput = currentInput.substring(0, currentInput.length() - 1);
binding.editTextDisplay.setText(currentInput.isEmpty() ? "0" : currentInput);
}
} else if (v.getId() == R.id.btnEquals) {
try {
Expression exp = new ExpressionBuilder(expression.isEmpty() ? currentInput : expression).build();
double result = exp.evaluate();
long longResult = (long) result;
String displayResult = (result == (double) longResult) ? String.valueOf(longResult) : String.valueOf(result);
binding.textViewHistory.setText((expression.isEmpty() ? currentInput : expression) + " =");
binding.editTextDisplay.setText(displayResult);
currentInput = displayResult;
expression = "";
} catch (Exception e) {
binding.editTextDisplay.setText("Error");
}
} else if (v.getId() == R.id.btnPlusMinus) {
if (!currentInput.isEmpty() && !currentInput.equals("0")) {
if (currentInput.startsWith("-")) {
currentInput = currentInput.substring(1);
} else {
currentInput = "-" + currentInput;
}
binding.editTextDisplay.setText(currentInput);
}
} else if (v.getId() == R.id.btnPercent) {
if (!currentInput.isEmpty()) {
double val = Double.parseDouble(currentInput) / 100;
currentInput = String.valueOf(val);
binding.editTextDisplay.setText(currentInput);
}
} else {
// 处理数字和操作符
if (isOperator(text)) {
if (!currentInput.isEmpty()) {
expression = currentInput + text;
binding.textViewHistory.setText(expression);
currentInput = "";
} else if (!expression.isEmpty()) {
expression = expression.replaceAll("[+\\-×÷]$", text);
binding.textViewHistory.setText(expression);
}
} else {
currentInput += text;
binding.editTextDisplay.setText(currentInput);
}
}
};
// 为每个按钮设置监听器
for (int id : buttonIds) {
View btn = binding.getRoot().findViewById(id); // 或直接 binding.btn0 等
if (btn != null) {
btn.setOnClickListener(listener);
}
}
}
private boolean isOperator(String str) {
return "+".equals(str) || "-".equals(str) || "×".equals(str) || "÷".equals(str);
}
}
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F5F5F5"
android:padding="8dp">
<!-- 历史表达式显示 -->
<TextView
android:id="@+id/textViewHistory"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
android:textSize="16sp"
android:textColor="#666666"
android:gravity="end"
android:padding="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<!-- 当前输入/结果显示 -->
<EditText
android:id="@+id/editTextDisplay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="0"
android:textSize="32sp"
android:textColor="#000000"
android:gravity="end"
android:padding="16dp"
android:background="@android:color/transparent"
android:focusable="false"
android:cursorVisible="false"
app:layout_constraintTop_toBottomOf="@id/textViewHistory"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<!-- 按钮网格容器 -->
<GridLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:columnCount="4"
android:rowCount="5"
android:useDefaultMargins="true"
app:layout_constraintTop_toBottomOf="@id/editTextDisplay"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<!-- 第一行:清除、正负、百分比、除法 -->
<Button
android:id="@+id/btnClear"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="C"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnPlusMinus"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="+/-"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnPercent"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="%"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnDivide"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="÷"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
<!-- 第二行:7,8,9,乘法 -->
<Button
android:id="@+id/btn7"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="7"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn8"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="8"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn9"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="9"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnMultiply"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="×"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
<!-- 第三行:4,5,6,减法 -->
<Button
android:id="@+id/btn4"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="4"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn5"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="5"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn6"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="6"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnSubtract"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="-"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
<!-- 第四行:1,2,3,加法 -->
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="1"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="2"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="3"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnAdd"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="+"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
<!-- 第五行:0,小数点,删除,等于 -->
<Button
android:id="@+id/btn0"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="2"
android:layout_columnSpan="2"
android:layout_margin="4dp"
android:text="0"
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnDot"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="."
android:textSize="18sp"
android:textColor="#000000"
android:backgroundTint="#E0E0E0"
style="?android:attr/buttonStyle" />
<ImageButton
android:id="@+id/btnDelete"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:src="@drawable/ic_backspace"
android:backgroundTint="#E0E0E0"
android:contentDescription="Delete"
style="?android:attr/buttonStyle" />
<Button
android:id="@+id/btnEquals"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
android:text="="
android:textSize="18sp"
android:textColor="#FFFFFF"
android:backgroundTint="#FF9500"
style="?android:attr/buttonStyle" />
</GridLayout>
</androidx.constraintlayout.widget.ConstraintLayout>使用android Studio进行开发仿 Windows10 计算器
计算器是日常生活中常用的工具,下面仿写Windows10系统自带的计算器。计算器的页面由8部分组成,利用权重垂直方向分配高度,使组件占满整个屏幕,见图
4.12。第1 部分由EditText组成,重心向右。第2部分由水平方向的LinearLayout组成,内部包含6个TextVicw,水平方向6等分,注意字体颜色。第3部分由水平方向的LinearLayout组成,内部包含 Button和 ImageButton,水平方向4等分,ImageButton用于展示无法文本输出的“删除按键”,Button用于展示可以文本输出的其余按键。第4至8部分与第3部分设计的思路一致。注意采用Background 设置按钮不同的背景色。