Android Studio入门,制作一个简单的计算器。

(1)这学期自学了一下java,主要是想制作一个属于自己的安卓app。毕竟现在是“ 一机在手,天下我有”的世界,不管去什么地方,只要有手机,就心安了……
(2)废话就不说了,先说一下我的思路。因为刚入门,所以也用不到什么复杂的知识。主要是下面这几个类的基本用法:
①String;
②StringBuilder;
③Double。
其中String类中有一个contains()的方法,用来判断一个字符串是否含有指定的字符。那么在这个简单的计算器中,这个方法就可以用来判断运算类型等等……
而StringBuilder(当然也可以用StringBuffer,但StringBuffer性能比较低,虽说它是线程安全的,但我的计算器是单线程的,所以就没有用它)呢,作用就比较强大了。StringBuilder可以用来表示屏幕上结果栏显示的内容,也可以作为第一个操作数和第二个操作数的字符串表示形式。有了数字的字符串表示形式,那么就可以用Double类的parseDouble()方法,将字符串转换成小数。然后,再用被解析出来的数字进行加、减、乘、除等运算。
(3)当然了,还要考虑很多的细节,比如说,禁止用户一上来就点击加减乘除号;已经输入加减乘除号了,还要疯狂重复点击多次。但是这些细节,在你动手写代码,并进行测试的时候,你就有处理的思路了。
(4)布局是用线性布局做的,也可以用表格布局等其他布局。因为我对线性布局最熟悉,所以就用线性布局做了。制作界面的时候遇到了一个问题:有三个Button和一个ImageButton,明明都为它们设置了android:layout_weight=“1”,但是,它们并没有平分空间,也不知道为什么。我最后只好再嵌套一个线性布局,不行的话,继续嵌套,直到达到自己想要的效果为止。相比于HTML
中的嵌套层次,我的嵌套次数还算少的。听说布局嵌套过多会影响程序的性能,但是我目前没什么感觉。
(5)此外,还用到了状态图形这么一个知识,也就是用xml编写一个控件的背景。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#ffffff" android:endColor="#555555"/>
    <stroke android:color="#aaaaaa" android:dashGap="0dp" android:width="1dp"/><!--边框-->
    <corners android:radius="10dp"/><!--圆角-->
</shape>

但是上面的图形是静态的,写一个动态图形可以像下面那样写:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true" android:drawable="@drawable/button_pressed_orig"/>
    <item android:drawable="@drawable/button_normal_orig"/>
</selector>

之所以说是“动态”的,是因为上面这张图形,你点击它的时候是第一种形态,而松开手之后,又是另一种形态。
至于“<shape>”标签和“<selector>”标签里面具体还能写什么内容,这里就不再赘述了。
(6)计算器的界面如下图所示:
在这里插入图片描述
(7)下面是java代码,虽然代码很长,但因为刚入门,也没有实现什么复杂的功能,也就是简单的加减乘除和开根运算。总体来说,就是用switch语句,为每一个按钮绑定单击事件。没有将重复的代码抽取出来,代码重复率较高,纯粹为了节省时间,反正重复的代码都是复制粘贴的,抽取出来反而花更多的时间。写这个计算器花了我一天半的时间吧,也算是比较长的了。

package com.example.mycalculator;

import android.app.Dialog;
import android.os.Process;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import java.util.regex.*;

public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener
{
    private Button delOneBtn,chuBtn,chengBtn,delAllBtn,sevenBtn,eightBtn,nightBtn,jiaBtn,fourBtn,fiveBtn,sixBtn,jianBtn,oneBtn,twoBtn,threeBtn,zeroBtn,pointBtn,equalBtn;
    private ImageButton genhaoBtn;
    private TextView showTV;//显示输入、计算结果的文本框
    private StringBuilder stringBuilder=new StringBuilder();//文本框中的字符串
    private double result;//计算结果
    private StringBuilder firstNumBuilder=new StringBuilder();//第一个操作数
    private StringBuilder secondNumBuilder=new StringBuilder();//第二个操作数

    //private static final String TAG = "CalculatorActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculator);

        //按钮的实例化
        delOneBtn=findViewById(R.id.delOneBtn);
        chuBtn=findViewById(R.id.chuBtn);
        chengBtn=findViewById(R.id.chengBtn);
        delAllBtn=findViewById(R.id.delAllBtn);
        sevenBtn=findViewById(R.id.sevenBtn);
        eightBtn=findViewById(R.id.eightBtn);
        nightBtn=findViewById(R.id.nightBtn);
        jiaBtn=findViewById(R.id.jiaBtn);
        fourBtn=findViewById(R.id.fourBtn);
        fiveBtn=findViewById(R.id.fiveBtn);
        sixBtn=findViewById(R.id.sixBtn);
        jianBtn=findViewById(R.id.jianBtn);
        oneBtn=findViewById(R.id.oneBtn);
        twoBtn=findViewById(R.id.twoBtn);
        threeBtn=findViewById(R.id.threeBtn);
        genhaoBtn=findViewById(R.id.genhaoBtn);
        zeroBtn=findViewById(R.id.zeroBtn);
        pointBtn=findViewById(R.id.pointBtn);
        equalBtn=findViewById(R.id.equalBtn);
        showTV=findViewById(R.id.showTV);//文本的实例化
        showTV.setMovementMethod(ScrollingMovementMethod.getInstance());//让文本框可以滑动

        //设置点击事件
        oneBtn.setOnClickListener(this);
        twoBtn.setOnClickListener(this);
        threeBtn.setOnClickListener(this);
        fourBtn.setOnClickListener(this);
        fiveBtn.setOnClickListener(this);
        sixBtn.setOnClickListener(this);
        sevenBtn.setOnClickListener(this);
        eightBtn.setOnClickListener(this);
        nightBtn.setOnClickListener(this);
        zeroBtn.setOnClickListener(this);
        jiaBtn.setOnClickListener(this);//加的按钮
        jianBtn.setOnClickListener(this);//减的按钮
        chengBtn.setOnClickListener(this);//乘的按钮
        chuBtn.setOnClickListener(this);//除的按钮
        equalBtn.setOnClickListener(this);//等于号的按钮
        delAllBtn.setOnClickListener(this);//清空所有的按钮
        delOneBtn.setOnClickListener(this);//删除一个字符的按钮
        pointBtn.setOnClickListener(this);
        genhaoBtn.setOnClickListener(this);
        //Log.d(TAG, "活动被创建了!");





    }

    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.oneBtn:

                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("1");
                    firstNumBuilder.append("1");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("1");
                    secondNumBuilder.append("1");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.twoBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("2");
                    firstNumBuilder.append("2");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("2");
                    secondNumBuilder.append("2");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.threeBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("3");
                    firstNumBuilder.append("3");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("3");
                    secondNumBuilder.append("3");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.fourBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("4");
                    firstNumBuilder.append("4");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("4");
                    secondNumBuilder.append("4");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.fiveBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("5");
                    firstNumBuilder.append("5");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("5");
                    secondNumBuilder.append("5");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.sixBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("6");
                    firstNumBuilder.append("6");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("6");
                    secondNumBuilder.append("6");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.sevenBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("7");
                    firstNumBuilder.append("7");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("7");
                    secondNumBuilder.append("7");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.eightBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("8");
                    firstNumBuilder.append("8");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("8");
                    secondNumBuilder.append("8");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.nightBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("9");
                    firstNumBuilder.append("9");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("9");
                    secondNumBuilder.append("9");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.zeroBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    stringBuilder.append("0");
                    firstNumBuilder.append("0");
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    stringBuilder.append("0");
                    secondNumBuilder.append("0");
                }
                if(stringBuilder.toString().contains("√"))//输入根号之后
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();

                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }

                showTV.setText(stringBuilder.toString());
                break;
            case R.id.jiaBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))
                {
                    if(!firstNumBuilder.toString().equals(""))
                    {
                        stringBuilder.append("+");
                    }
                }
                if(firstNumBuilder.toString().equals(""))
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.jianBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))
                {
                    if(!firstNumBuilder.toString().equals(""))
                    {
                        stringBuilder.append("-");
                    }
                }
                if(firstNumBuilder.toString().equals(""))
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.chengBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))
                {
                    if(!firstNumBuilder.toString().equals(""))
                    {
                        stringBuilder.append("×");
                    }
                }
                if(firstNumBuilder.toString().equals(""))
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.chuBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))
                {
                    if(!firstNumBuilder.toString().equals(""))
                    {
                        stringBuilder.append("÷");
                    }
                }
                if(firstNumBuilder.toString().equals(""))
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.genhaoBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))
                {
                    if(!firstNumBuilder.toString().equals(""))
                    {
                        stringBuilder.append("√");
                    }

                }
                if(firstNumBuilder.toString().equals(""))//如果还没输入第一个数或者是已经进行完了一次计算
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }
                showTV.setText(stringBuilder.toString());

                break;
            case R.id.equalBtn:

                if(!stringBuilder.toString().contains("="))//如果stringBuilder不含有等于号的话,才会让你添加等于号
                {
                    stringBuilder.append("=");
                    if(stringBuilder.toString().contains("+"))//说明进行的是加法运算
                    {
                        if(!firstNumBuilder.toString().equals("")&&!secondNumBuilder.toString().equals("")) //如果输入了第一个数,并且输入了第二个数
                        {
                            double a = Double.parseDouble(firstNumBuilder.toString());
                            double b = Double.parseDouble(secondNumBuilder.toString());
                            result=a+b;
                        }
                        if(firstNumBuilder.toString().equals("")||secondNumBuilder.toString().equals(""))//如果用户一上来就点击"等于"按钮
                        {
                            Toast.makeText(CalculatorActivity.this,"亲!你还没有输入完整的两个数字呢!",Toast.LENGTH_SHORT).show();
                            result=0.0;

                        }

                    }
                    if(stringBuilder.toString().contains("-"))//说明进行的是减法运算
                    {
                        if(!firstNumBuilder.toString().equals("")&&!secondNumBuilder.toString().equals("")) //如果输入了第一个数,并且输入了第二个数
                        {
                            double a = Double.parseDouble(firstNumBuilder.toString());
                            double b = Double.parseDouble(secondNumBuilder.toString());
                            result = a - b;
                        }
                        if(firstNumBuilder.toString().equals("")||secondNumBuilder.toString().equals(""))//如果用户一上来就点击"等于"按钮
                        {
                            Toast.makeText(CalculatorActivity.this,"亲!你还没有输入任何数字呢!",Toast.LENGTH_SHORT).show();
                            result=0.0;

                        }

                    }
                    if(stringBuilder.toString().contains("×"))//说明进行的是乘法运算
                    {
                        if(!firstNumBuilder.toString().equals("")&&!secondNumBuilder.toString().equals("")) //如果输入了第一个数,并且输入了第二个数
                        {
                            double a = Double.parseDouble(firstNumBuilder.toString());
                            double b = Double.parseDouble(secondNumBuilder.toString());
                            result = a * b;
                        }
                        if(firstNumBuilder.toString().equals("")||secondNumBuilder.toString().equals(""))//如果用户一上来就点击"等于"按钮
                        {
                            Toast.makeText(CalculatorActivity.this,"亲!你还没有输入任何数字呢!",Toast.LENGTH_SHORT).show();
                            result=0.0;

                        }

                    }
                    if(stringBuilder.toString().contains("÷"))//说明进行的是除法运算
                    {
                        if(!firstNumBuilder.toString().equals("")&&!secondNumBuilder.toString().equals("")) //如果输入了第一个数,并且输入了第二个数
                        {
                            double a = Double.parseDouble(firstNumBuilder.toString());
                            double b = Double.parseDouble(secondNumBuilder.toString());
                            if (b == 0.0)
                            {
                                Toast.makeText(CalculatorActivity.this, "除数不能为0!", Toast.LENGTH_SHORT).show();
                            }

                            result = a / b;
                        }
                        if(firstNumBuilder.toString().equals("")||secondNumBuilder.toString().equals(""))//如果用户一上来就点击"等于"按钮
                        {
                            Toast.makeText(CalculatorActivity.this,"亲!你还没有输入任何数字呢!",Toast.LENGTH_SHORT).show();
                            result=0.0;

                        }

                    }
                    if(stringBuilder.toString().contains("√"))//说明进行的是开根运算
                    {
                        if(!firstNumBuilder.toString().equals(""))//如果已经输入了第一个数,也就是被开根的数
                        {
                            double a = Double.parseDouble(firstNumBuilder.toString());
                            double sqrt = Math.sqrt(a);
                            result=sqrt;

                        }
                        if(firstNumBuilder.toString().equals(""))//如果用户一上来就点击"等于"按钮
                        {
                            Toast.makeText(CalculatorActivity.this,"亲!你还没有输入任何数字呢!",Toast.LENGTH_SHORT).show();
                            result=0.0;

                        }

                    }
                    //这是按下第一个操作数,用户就点击等于号的情况(当然进行的不是开根运算)
                    if(!stringBuilder.toString().contains("√")&&secondNumBuilder.toString().equals("")&&!firstNumBuilder.toString().equals(""))
                    {
                        result=Double.parseDouble(firstNumBuilder.toString());

                    }
                    showTV.setText(stringBuilder.toString()+result);
                    result=0;//重置数字
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());

                }


                break;

            case R.id.delAllBtn:
                showTV.setText("");
                stringBuilder.delete(0,stringBuilder.length());//清空字符串
                result=0.0;
                firstNumBuilder.delete(0,firstNumBuilder.length());
                secondNumBuilder.delete(0,secondNumBuilder.length());
                break;

            case R.id.delOneBtn://删除一个字符的按钮

                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果stringBuilder不包含加减乘除根号,说明输入的是第一个数
                {
                    if(firstNumBuilder.length()!=0)
                    {
                        firstNumBuilder.delete(firstNumBuilder.length() - 1, firstNumBuilder.length());//删除最后一个数
                    }
                    if(stringBuilder.length()!=0)//防止出现越界问题
                    {
                        stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
                    }
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷")||stringBuilder.toString().contains("√"))//如果stringBuilder包含加减乘除根号
                {
                    if(secondNumBuilder.toString().equals("")&&!stringBuilder.toString().contains("="))//说明此时刚好输入运算符,还没开始输入第二个数
                    {
                        if(stringBuilder.length()!=0) //防止出现越界问题
                        {
                            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());//删除运算符号
                        }
                        Toast.makeText(CalculatorActivity.this,"还没输入第二个数",Toast.LENGTH_SHORT).show();
                    }
                    if (!secondNumBuilder.toString().equals(""))//说明已经输入第二个操作数了
                    {
                        if(secondNumBuilder.length()!=0)//防止出现越界问题
                        {
                            secondNumBuilder.delete(secondNumBuilder.length() - 1, secondNumBuilder.length());//删除第二个操作数的最后一个数字
                        }
                        if(stringBuilder.length()!=0)//防止出现越界问题
                        {
                            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
                        }
                    }
                    if(stringBuilder.toString().contains("="))//说明此时已经进行完了一次计算,在“等于”按钮的点击事件里,已经对firstNumStringBuilder、sencondtNumStringBuilder、result进行了复位处理
                    {
                        Toast.makeText(CalculatorActivity.this,"请清空数据!",Toast.LENGTH_SHORT).show();

                    }

                }
                showTV.setText(stringBuilder.toString());
                break;
            case R.id.pointBtn:
                if(!stringBuilder.toString().contains("+")&&!stringBuilder.toString().contains("-")&&!stringBuilder.toString().contains("×")&&!stringBuilder.toString().contains("÷")&&!stringBuilder.toString().contains("√"))//如果不包含加减乘除根号,说明输入的是第一个数
                {
                    if(!stringBuilder.toString().contains(".")) //防止输入第一个数时输入多个点
                    {
                        //不能一开始就输入点,而前面还没有输入任何数
                        String zhengze=".*\\d+.*" ;
                        boolean matches = Pattern.matches(zhengze, firstNumBuilder.toString());
                        if(matches) //如果已经输入数字了,才能够输入小数点
                        {
                            firstNumBuilder.append(".");
                            stringBuilder.append(".");
                        }
                    }
                }
                if(stringBuilder.toString().contains("+")||stringBuilder.toString().contains("-")||stringBuilder.toString().contains("×")||stringBuilder.toString().contains("÷"))//如果包含加减乘除号,说明输入的是第二个数
                {
                    if(!secondNumBuilder.toString().contains(".")) //防止输入第二个数时输入多个点
                    {
                        //第二个数不能以小数点开头
                        String zhengze = ".*\\d+.*";    //正则表达式
                        boolean matches = Pattern.matches(zhengze, secondNumBuilder.toString());
                        if(matches)
                        {
                            secondNumBuilder.append(".");
                            stringBuilder.append(".");
                        }
                    }
                }
                if(stringBuilder.toString().contains("√"))
                {
                    Toast.makeText(CalculatorActivity.this,"非法输入!",Toast.LENGTH_SHORT).show();
                }
                if(stringBuilder.toString().contains("="))//如果stringBuilder包含等于号,说明已经进行完了一次运算
                {
                    //清空数据
                    stringBuilder.delete(0,stringBuilder.length());
                    firstNumBuilder.delete(0,firstNumBuilder.length());
                    secondNumBuilder.delete(0,secondNumBuilder.length());
                    result=0.0;
                    showTV.setText("");
                }
                if(firstNumBuilder.toString().equals(""))
                {
                    if(stringBuilder.length()!=0)
                    {
                        stringBuilder.delete(0, stringBuilder.length());
                    }
                }

                showTV.setText(stringBuilder.toString());

                break;

            default:

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        menu.add(1,1,1,"关于");
        menu.add(1,2,2,"退出程序");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case 1:
                Toast.makeText(CalculatorActivity.this,"本程序由无限苦肉盖神编写",Toast.LENGTH_SHORT).show();
                break;
            case 2:
                finish();
                Process.killProcess(Process.myPid());//杀掉当前进程
                break;
                default:
        }
        return super.onOptionsItemSelected(item);
    }
}

(8)下面是布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="@drawable/zhubj"
    tools:context=".CalculatorActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="100dp">
    <TextView
        android:id="@+id/showTV"
        android:layout_width="match_parent"
        android:background="@drawable/bj"
        android:scrollbars="vertical"
        android:textSize="24sp"
        android:gravity="center"
        android:layout_height="match_parent"
        />
</LinearLayout>



    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Button
            android:id="@+id/delOneBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:textAllCaps="false"
            android:background="@drawable/tuxing"
            android:textSize="20sp"
            android:layout_weight="1"
            android:text="后退"/>
        <Button
            android:id="@+id/chuBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="÷"/>
        <Button
            android:id="@+id/chengBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="×"/>
        <Button
            android:id="@+id/delAllBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:textAllCaps="false"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="20sp"
            android:text="清空"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="1"
        android:gravity="center">
        <Button
            android:id="@+id/sevenBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="7"/>
        <Button
            android:id="@+id/eightBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="8"/>
        <Button
            android:id="@+id/nightBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="9"/>
        <Button
            android:id="@+id/jiaBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text=""/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="1"
        android:gravity="center">
        <Button
            android:id="@+id/fourBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="4"/>
        <Button
            android:id="@+id/fiveBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="5"/>
        <Button
            android:id="@+id/sixBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text="6"/>
        <Button
            android:id="@+id/jianBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/tuxing"
            android:layout_weight="1"
            android:textSize="30sp"
            android:text=""/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <Button
                android:id="@+id/oneBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:textSize="30sp"
                android:layout_weight="1"
                android:text="1" />

            <Button
                android:id="@+id/twoBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:layout_weight="1"
                android:textSize="30sp"
                android:text="2" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <Button
                android:id="@+id/threeBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:layout_weight="1"
                android:textSize="30sp"
                android:text="3" />

            <ImageButton
                android:id="@+id/genhaoBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:scaleType="centerInside"
                android:layout_weight="1"
                android:src="@drawable/sqrt"/><!--scaleType属性很重要,否则图片不能完全显示-->

        </LinearLayout>
    </LinearLayout>



    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="1"
        >

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <Button
                android:id="@+id/zeroBtn"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:textSize="30sp"
                android:text="0"/>
        </LinearLayout>


        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <Button
                android:id="@+id/pointBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:layout_weight="1"
                android:textSize="30sp"
                android:text="·"/>
            <Button
                android:id="@+id/equalBtn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:background="@drawable/tuxing"
                android:layout_weight="1"
                android:textSize="30sp"
                android:text=""/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

(9)另外的图片资源就不上传上来了,可以自己用其他图片来代替。

发布了33 篇原创文章 · 获赞 0 · 访问量 1449

猜你喜欢

转载自blog.csdn.net/Deep_rooted/article/details/103421187