简单的Android小程序----计算器APP

提示:代码是完整的,可以直接复制到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.最终的运行页面

代码是完全可以运行的,可以基于这个简单的模版,选择自己喜欢的样式进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值