(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)另外的图片资源就不上传上来了,可以自己用其他图片来代替。