Android Studio简易计算器

简易计算器

该项目是基于Android下简单的计算器程序,能够满足基本的运算,并在MUMU模拟器上运行。

实现以下功能:

  1. +、-、×、÷
  2. ±、. 、C、<- - - 、%

布局如下所示:
在这里插入图片描述

代码如下所示:
样式代码:
为了减少在布局文件中的代码,使用样式可以在布局文件中直接引用

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="text_one">
        <item name="android:layout_width">120dp</item>
        <item name="android:layout_height">97dp</item>
        <item name="android:textSize">30sp</item>
        <item name="android:onClick">onClick</item>
        <item name="android:textColor">#03A9F4</item>
        <item name="android:background">#FFFFFF</item>
    </style>
    <style name="text_two" parent="text_one">
        <item name="android:textColor">#0E0D0D</item>
        <item name="android:background">#FFFFFF</item>
    </style>
    <style name="text_three" parent="text_one">
        <item name="android:textColor">#ffff</item>
        <item name="android:background">#2196F3</item>
    </style>
</resources>

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    
   //显示用户输入所以内容的文本框
    <TextView
        android:id="@+id/textView1" 
        android:layout_width="200dp"
        android:layout_height="150dp"
        android:layout_marginTop="20dp"
        android:textSize="50sp"
        android:gravity="right"
        android:cursorVisible="false"/> //游标不可见
        
     //显示用户正在输入的内容的文本框
    <TextView
        android:id="@+id/tv_input"
        android:layout_width="200dp"
        android:layout_height="150dp"
        android:textSize="50sp"
        android:gravity="right"
        android:enabled="false"
        android:textColor="#141414"
        android:cursorVisible="false"/>

        //使用表格行存放按钮(共有5个表格行)
        <TableRow>
            <Button
                android:id="@+id/btn_clear"
                android:text="C"
                style="@style/text_one" />
            <Button
                android:id="@+id/btn_divide"
                style="@style/text_one"
                android:text="÷" />
            <Button
                android:id="@+id/btn_multiply"
                android:text="×"
                style="@style/text_one" />
            <Button
                android:id="@+id/btn_delete"
                //因为<--为非法字符,所以用图片形式显示
                android:background="@drawable/dd"
                style="@style/text_one" />
        </TableRow>
        <TableRow>
            <Button
                android:id="@+id/btn_num7"
                android:text="7"
                style="@style/text_two" />
            <Button
                android:id="@+id/btn_num8"
                android:text="8"
                style="@style/text_two" />
            <Button
                android:id="@+id/btn_num9"
                android:text="9"
                style="@style/text_two" />
            <Button
                android:id="@+id/btn_sub"
                android:text="-"
                style="@style/text_one" />
        </TableRow>
        <TableRow>
            <Button
                android:id="@+id/btn_num4"
                android:text="4"
                style="@style/text_two" />
            <Button
                android:id="@+id/btn_num5"
                android:text="5"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_num6"
                android:text="6"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_add"
                android:text="+"
                style="@style/text_one" />
        </TableRow>
        <TableRow>
            <Button
                android:id="@+id/btn_num1"
                android:text="1"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_num2"
                android:text="2"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_num3"
                android:text="3"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_percent"
                android:text="%"
                style="@style/text_one" />
        </TableRow>
        <TableRow>
            <Button
                android:id="@+id/btn_signed"
                android:text="±"
                style="@style/text_two" />
            <Button
                android:id="@+id/btn_num0"
                android:text="0"
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_point"
                android:text="."
                style="@style/text_two"/>
            <Button
                android:id="@+id/btn_equal"
                android:text="="
                style="@style/text_three"/>
        </TableRow>
</TableLayout>

界面交互代码:

package com.example.calculator;

import java.util.*;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity implements OnClickListener {

    private List<Double> value_list = new ArrayList<Double>();// 使用Double泛型存用户输入的数字
    private List<Integer> operator_list = new ArrayList<Integer>();// 使用Integer泛型存用户输入的运算符,定义+为0,-为1,×为2,÷为3, %为4
    // 状态记录(防止用户多次输入)
    private boolean add_flag = false;// +按下
    private boolean minus_flag = false;// -按下
    private boolean multi_flag = false;// ×按下
    private boolean div_flag = false;// ÷按下
    private boolean result_flag = false;// =按下
    private boolean can_operate_flag = false;// 按下=是否响应
    private boolean per_flag = false;//百分号
    private static int sign_flag = 0;//正负号(记录按下的次数)

    private TextView textView1;
    private TextView editText1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //按钮初始化以及设监听器
        findViewById(R.id.btn_num0).setOnClickListener(this);
        findViewById(R.id.btn_num1).setOnClickListener(this);
        findViewById(R.id.btn_num2).setOnClickListener(this);
        findViewById(R.id.btn_num3).setOnClickListener(this);
        findViewById(R.id.btn_num4).setOnClickListener(this);
        findViewById(R.id.btn_num5).setOnClickListener(this);
        findViewById(R.id.btn_num6).setOnClickListener(this);
        findViewById(R.id.btn_num7).setOnClickListener(this);
        findViewById(R.id.btn_num8).setOnClickListener(this);
        findViewById(R.id.btn_num9).setOnClickListener(this);
        findViewById(R.id.btn_point).setOnClickListener(this);
        findViewById(R.id.btn_clear).setOnClickListener(this);
        findViewById(R.id.btn_add).setOnClickListener(this);
        findViewById(R.id.btn_sub).setOnClickListener(this);
        findViewById(R.id.btn_multiply).setOnClickListener(this);
        findViewById(R.id.btn_divide).setOnClickListener(this);
        findViewById(R.id.btn_equal).setOnClickListener(this);
        findViewById(R.id.btn_delete).setOnClickListener(this);
        findViewById(R.id.btn_percent).setOnClickListener(this);
        findViewById(R.id.btn_signed).setOnClickListener(this);
        textView1 = (TextView) findViewById(R.id.textView1);
        editText1 = (TextView) findViewById(R.id.tv_input);
    }
    
    //触发点击事件,使用switch判断哪个事件被触发
    //其中0-9和“ . ”触发的事件调用调用num_down(String num)方法
    //+ 、- 、 × 、÷ 、% 调用 = 中自带的方法 operator_list.add(_operator)
    //±将两个文本框的内容强转为String类型,replace()对正负进行替换,并使用全局变量对点击次数标识需要运行的语句,在点击第二次的时候使用trim()方法对对空白字符进行清空
    //C使用自带的方法clear()直接进行清除
    //<--将文本框的内容强转为String类型,substring()对已输入的内容进行截取
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_num0:
                num_down("0");
                break;
            case R.id.btn_num1:
                num_down("1");
                break;
            case R.id.btn_num2:
                num_down("2");
                break;
            case R.id.btn_num3:
                num_down("3");
                break;
            case R.id.btn_num4:
                num_down("4");
                break;
            case R.id.btn_num5:
                num_down("5");
                break;
            case R.id.btn_num6:
                num_down("6");
                break;
            case R.id.btn_num7:
                num_down("7");
                break;
            case R.id.btn_num8:
                num_down("8");
                break;
            case R.id.btn_num9:
                num_down("9");
                break;
            case R.id.btn_point:
                num_down(".");
                break;
            case R.id.btn_add:
                if (!add_flag)// 防止用户多次输入一个符号键,符号键只允许输入一次
                {
                    result_flag = false;
                    value_list.add(Double.parseDouble(editText1.getText()
                            .toString()));// 将当前已输入的数字放入value_list
                    operator_list.add(0);
                    textView1.setText(textView1.getText() + "+");
                    add_flag = true;
                    can_operate_flag = false;// 刚刚输入完符号,不能构成一条正常的表达式,如111+,设置为不可运行状态
                }
                break;
            case R.id.btn_sub:
                if (!minus_flag) {
                    result_flag = false;
                    value_list.add(Double.parseDouble(editText1.getText()
                            .toString()));
                    operator_list.add(1);
                    textView1.setText(textView1.getText() + "-");
                    minus_flag = true;
                    can_operate_flag = false;
                }
                break;
            case R.id.btn_multiply:
                if (!multi_flag) {
                    result_flag = false;
                    value_list.add(Double.parseDouble(editText1.getText()
                            .toString()));
                    operator_list.add(2);
                    textView1.setText("(" + textView1.getText() + ")×");// 给前面的已经输入的东西加个括号。
                    multi_flag = true;
                    can_operate_flag = false;
                }
                break;
            case R.id.btn_divide:
                if (!div_flag) {
                    result_flag = false;
                    value_list.add(Double.parseDouble(editText1.getText()
                            .toString()));
                    operator_list.add(3);
                    textView1.setText("(" + textView1.getText() + ")÷");
                    div_flag = true;
                    can_operate_flag = false;
                }
                break;
            case R.id.btn_percent:
                if (!per_flag) {
                    result_flag = false;
                    value_list.add(Double.parseDouble(editText1.getText().toString()));
                    operator_list.add(4);
                    textView1.setText(textView1.getText() + "%");
                    per_flag = true;
                    can_operate_flag = true;
                }
                break;
            case R.id.btn_signed:
                    if (sign_flag == 0) {
                        textView1.setText("-" + textView1.getText());
                        editText1.setText("-" + editText1.getText());
                        String s = (String) textView1.getText();
                        String s1 = (String) editText1.getText();
                            if (!s.equals('-')) {
                                textView1.setText(s.replace(' ', '-'));
                                textView1.setText(textView1.getText());
                            }
                            if (!s1.equals('-')) {
                                editText1.setText(s1.replace(' ', '-'));
                                editText1.setText(editText1.getText());
                            }
                            sign_flag=1;
                    } else if (sign_flag == 1) {
                        String s = (String) textView1.getText();
                        String s1 = (String) editText1.getText();
                        if (!s.equals(' ')) {
                            textView1.setText(s.replace('-', ' '));
                            textView1.setText(((String) textView1.getText()).trim());
                        }
                        if (!s1.equals(' ')) {
                            editText1.setText(s1.replace('-', ' '));
                            editText1.setText(((String) editText1.getText()).trim());
                        }
                        sign_flag = 0;
                    }
                break;
            case R.id.btn_equal:
                if (value_list.size() > 0 && operator_list.size() > 0
                        && can_operate_flag) {// 需要防止用户没输入数字,或者只输入了一个数,就按=。
                    value_list.add(Double.parseDouble(editText1.getText()
                            .toString()));
                    double total = value_list.get(0);
                    for (int i = 0; i < operator_list.size(); i++) {
                        int _operator = operator_list.get(i);// operator运算符重载的关键字,前面加个_来区别
                        switch (_operator) {
                            case 0:
                                total += value_list.get(i + 1);
                                break;
                            case 1:
                                total -= value_list.get(i + 1);
                                break;
                            case 2:
                                total *= value_list.get(i + 1);
                                break;
                            case 3:
                                total /= value_list.get(i + 1);
                                break;
                            case 4:
                                total = value_list.get(i + 1) / 100;
                                break;
                            case 5:
                                total = value_list.get(i + 1) * (-1);
                        }
                    }
                    editText1.setText(total + "");
                    textView1.setText(total + "");
                    operator_list.clear();// 算完,就清空累积数字与运算数组
                    value_list.clear();
                    result_flag = true;// 表示=按下
                }
                break;
            case R.id.btn_clear:
                operator_list.clear();
                value_list.clear();
                add_flag = false;
                minus_flag = false;
                multi_flag = false;
                div_flag = false;
                result_flag = false;
                per_flag = false;

                can_operate_flag = false;
                editText1.setText("");
                textView1.setText("");
                break;
            case R.id.btn_delete:
                String str =(String) textView1.getText();
                if (!str.equals("") && str!=null){
                    textView1.setText(str.substring(0,str.length()-1));
                }
                String str2 =(String) editText1.getText();
                if (!str2.equals("") && str2!=null){
                    editText1.setText(str2.substring(0,str2.length()-1));
                }
                break;
        }
    }
    // 数字键按下,含0与.
    private void num_down(String num) {
        if (add_flag || minus_flag || multi_flag || div_flag || result_flag) {
            if (result_flag)// 按下等号,刚刚算完一个运算的状态
            {
                textView1.setText("");
            }
            editText1.setText("");// 如果用户刚刚输入完一个运算符
            add_flag = false;
            minus_flag = false;
            multi_flag = false;
            div_flag = false;
            result_flag = false;
            per_flag = true;
        }
        //按下“ . ”并且输入内容的文本框中没有小数点即使用indexOf返回-1小于0,或者没有按下“ . ”才允许继续输入内容
        if ((num.equals(".") && editText1.getText().toString().indexOf(".") < 0)
                || !num.equals(".")) {
            // 如果用户输入的是小数点.,则要判断当前已输入的数字中是否含有小数点.才允许输入
            editText1.setText(editText1.getText() + num);
            textView1.setText(textView1.getText() + num);
            can_operate_flag = true;
        }

    }

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值