第一个Android程序——计算器
引言:毕业一个多月,入职一个多月,入职的岗位是java后端软件工程师,到了项目组,什么都做,从前端到后端,日后项目经理说还会让我们尝试去做其他平台的东西,这就当然包括Android和IOS,不过目前项目上不会让做这个。可是培训部的那帮人整出个周末去培训,其中一项Android,上周培训吧,培训“主讲人”讲了大概两个小时Android的历史,讲了一会儿activity和布局,然后就让我们写个简易计算器,当时就想,这培训真是水,计算器这么简单,分分钟不就写好了。。。。ps:虽然我从没有学过Android,从没有接触过Android开发。。。一周过去了,明天又特么的要去培训了,才想起来,那货明天要检查代码,于是,就花了大概1个小时看了会儿GridLayout布局和Android的工程结构,然后……(写之前,都没有去认真考虑计算器的逻辑结构,只想着布局完了,加点事件也就完事了,然后就出现了本文中这段恶心的代码,确实很恶心,我自己写的,自己看着都难受….)
界面,采用GridLayout布局方式,这也没什么可说的,就这么的往上添组件呗。。。
/Caculator/res/layout/activity_main.xml
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp"
android:columnCount="4"
android:rowCount="6"
android:id="@+id/Cacul"
tools:context=".CalcuActivity" >
<TextView
android:id="@+id/result"
android:layout_width="380dp"
android:layout_height="95dp"
android:layout_columnSpan="4"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_row="0"
android:textColor="#000000"
android:textSize="55sp"
android:gravity="right"
android:maxLength="12"
android:background="#EAEAEA">
</TextView>
<Button
android:id="@+id/clear"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="1"
android:layout_column="0"
android:layout_gravity="top"
android:text="C"
android:onClick="clearClick">
</Button>
<Button
android:id="@+id/backspace"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="1"
android:layout_column="1"
android:layout_gravity="top"
android:text="back"
android:onClick="backspaceClick" >
</Button>
<Button
android:id="@+id/div"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="1"
android:layout_column="2"
android:layout_gravity="top"
android:text="/"
android:onClick="divClick">
</Button>
<Button
android:id="@+id/mul"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="1"
android:layout_column="3"
android:layout_gravity="top"
android:text="X"
android:onClick="mulClick">
</Button>
<Button
android:id="@+id/seven"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="2"
android:layout_column="0"
android:layout_gravity="top"
android:text="7"
android:onClick="sevenClick">
</Button>
<Button
android:id="@+id/eight"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="2"
android:layout_column="1"
android:layout_gravity="top"
android:text="8"
android:onClick="eightClick">
</Button>
<Button
android:id="@+id/nine"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="2"
android:layout_column="2"
android:layout_gravity="top"
android:text="9"
android:onClick="nineClick">
</Button>
<Button
android:id="@+id/sub"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="2"
android:layout_column="3"
android:layout_gravity="top"
android:text="—"
android:onClick="subClick">
</Button>
<Button
android:id="@+id/four"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="3"
android:layout_column="0"
android:layout_gravity="top"
android:text="4"
android:onClick="fourClick" >
</Button>
<Button
android:id="@+id/five"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="3"
android:layout_column="1"
android:layout_gravity="top"
android:text="5"
android:onClick="fiveClick">
</Button>
<Button
android:id="@+id/six"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="3"
android:layout_column="2"
android:layout_gravity="top"
android:text="6"
android:onClick="sixClick">
</Button>
<Button
android:id="@+id/add"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="3"
android:layout_column="3"
android:layout_gravity="top"
android:text="+"
android:onClick="addClick">
</Button>
<Button
android:id="@+id/one"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="4"
android:layout_column="0"
android:layout_gravity="top"
android:text="1"
android:onClick="oneClick" >
</Button>
<Button
android:id="@+id/two"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="4"
android:layout_column="1"
android:layout_gravity="top"
android:text="2"
android:onClick="twoClick" >
</Button>
<Button
android:id="@+id/three"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="4"
android:layout_column="2"
android:layout_gravity="top"
android:text="3"
android:onClick="threeClick" >
</Button>
<Button
android:id="@+id/zero"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="5"
android:layout_column="0"
android:layout_columnSpan="2"
android:layout_gravity="fill_horizontal"
android:text="0"
android:onClick="zeroClick">
</Button>
<Button
android:id="@+id/point"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="5"
android:layout_column="2"
android:layout_gravity="top"
android:text="."
android:onClick="pointClick">
</Button>
<Button
android:id="@+id/equal"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_row="4"
android:layout_column="3"
android:layout_rowSpan="2"
android:layout_gravity="fill_vertical"
android:text="="
android:onClick="equalClick">
</Button>
</GridLayout>
布局就是这样(没有艺术细胞,so…..略丑….)
接下来就是Activity里写事件处理和逻辑部分了。
一、大概思路
对每个按钮进行事件监听,0~9还有小数点,这些按钮主要的功能是输入,所以op就做些输入的操作。+、-、x、/ and = 这些是运算符,首先为了区分+、-、x、/ 我在代码中设置了一个int型的op,初始值为0,表示还没有输入运算符,opStr是String类型,是为了显示而设置的。C是clear,就是清空等…..这里就不再赘述了,都明白….
二、逻辑判断
设置isFirstNumEnd用来判断第一个数是否已输入完成
设置hasOperation用来判断是否已经输入了操作符
设置hasPoint用来判断对于第一个数或第二个数是否已经输入了一个小数点
设置hasCount用来判断是否已经进行过运算
1、通过判断输入是否为运算符+ - x / 来设置第一个数是否输入结束
2、通过判断输入是否为 = 来设置第二个数是否输入结束
3、连续两次输入不能都为运算符
4、在某一个数中,不能存在一个以上的小数点
5、比如说,按以下顺序输入:2+4-5,逻辑为:计算出2+4的值,将其作为第一个数,然后开始监听等带运算符和第二个数的输入(这个地方其实就出现了一堆判断,是我自己弄复杂了)
6、and so on….
下面为Calculator.java的代码。
变量声明部分:
private int op = 0;//
private boolean isFirstNumEnd = false;//判断第一个数是否已输入完毕(根据是否输入了运算符进行判断)
private boolean hasCount = false;
private boolean hasOperation = false;//
private boolean hasPoint = false;
private double firstNum = 0;
private double secondNum = 0;
private double res = 0;
//private StringBuffer firStr = new StringBuffer("");
//private StringBuffer secStr = new StringBuffer("");
private String firStr = "";
private String opStr = "";
private String secStr = "";
private boolean divNumIsZero = false;
public TextView print = null;
onCreate() onCreateOptionsMenu() onOptionsItemSelected()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
print = (TextView)findViewById(R.id.result);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
0到9 Button的事件 获取数据
public void zeroClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"0";
print.setText(firStr);
}
else{
firStr = "0";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "0";
print.setText(firStr+opStr+secStr);
}
}
public void oneClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"1";
print.setText(firStr);
}
else{
firStr = "1";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "1";
print.setText(firStr+opStr+secStr);
}
}
public void twoClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"2";
print.setText(firStr);
}
else{
firStr = "2";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "2";
print.setText(firStr+opStr+secStr);
}
}
public void threeClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"3";
print.setText(firStr);
}
else{
firStr = "3";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "3";
print.setText(firStr+opStr+secStr);
}
}
public void fourClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"4";
print.setText(firStr);
}
else{
firStr = "4";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "4";
print.setText(firStr+opStr+secStr);
}
}
public void fiveClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"5";
print.setText(firStr);
}
else{
firStr = "5";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "5";
print.setText(firStr+opStr+secStr);
}
}
public void sixClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"6";
print.setText(firStr);
}
else{
firStr = "6";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "6";
print.setText(firStr+opStr+secStr);
}
}
public void sevenClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"7";
print.setText(firStr);
}
else{
firStr = "7";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "7";
print.setText(firStr+opStr+secStr);
}
}
public void eightClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"8";
print.setText(firStr);
}
else{
firStr = "8";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "8";
print.setText(firStr+opStr+secStr);
}
}
public void nineClick(View v){
if(hasOperation==false){//还没有输入运算符
if(isFirstNumEnd == false){
firStr = firStr+"9";
print.setText(firStr);
}
else{
firStr = "9";
print.setText(firStr);
isFirstNumEnd = false;
}
}
else{
secStr = secStr + "9";
print.setText(firStr+opStr+secStr);
}
}
pointButton 小数点
public void pointClick(View v){
if(hasPoint==false){//如果截止目前还没有输入小数点
if(isFirstNumEnd==false){
if("".equals(firStr)){
firStr = "0" + ".";
}
else{
firStr = firStr + ".";
}
print.setText(firStr);
}
else{
if("".equals(secStr)){
secStr = "0" + ".";
}
else{
secStr = secStr + ".";
}
print.setText(firStr+opStr+secStr);
}
hasPoint = true;
}
else{//如果已经输入了小数点,
}
}
加
//加
public void addClick(View v){
if(isFirstNumEnd==false){
isFirstNumEnd = true;
op = 1;//1 表示 Add
opStr = "+";
print.setText(firStr + opStr);
hasOperation = true;
}
else{
if(hasOperation==true){
if("".equals(secStr)){
op = 1;
opStr = "+";
print.setText(firStr + opStr);
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
secondNum = Double.valueOf(secStr).doubleValue();
res = Count(firstNum , secondNum);
if(divNumIsZero==false){
firStr = Double.toString(res);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
op = 1;
opStr = "+";
firstNum = 0;
secStr = "";
secondNum = 0;
print.setText(firStr + opStr);
}
else{
divNumIsZero = false;
}
}
}
else{//在按了等于之后,继续以运算结果为第一个数继续运算
op = 1;
opStr = "+";
print.setText(firStr+opStr);
hasOperation=true;
}
}
hasPoint = false;
hasCount = true;
}
减
//减
public void subClick(View v){
if(isFirstNumEnd==false){
isFirstNumEnd = true;
op = 2;//2 表示 Sub
opStr = "-";
print.setText(firStr + opStr);
hasOperation = true;
}
else{
if(hasOperation==true){
if("".equals(secStr)){
op = 2;
opStr = "-";
print.setText(firStr + opStr);
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
secondNum = Double.valueOf(secStr).doubleValue();
res = Count(firstNum , secondNum);
if(divNumIsZero==false){
firStr = Double.toString(res);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
op = 2;
opStr = "-";
firstNum = 0;
secStr = "";
secondNum = 0;
print.setText(firStr + opStr);
}
else{
divNumIsZero = false;
}
}
}
else{//在按了等于之后,继续以运算结果为第一个数继续运算
op = 2;
opStr = "-";
print.setText(firStr+opStr);
hasOperation=true;
}
}
hasPoint = false;
hasCount = true;
}
乘
//乘
public void mulClick(View v){
if(isFirstNumEnd==false){
isFirstNumEnd = true;
op = 3;//3 表示 Mul
opStr = "x";
print.setText(firStr + opStr);
hasOperation = true;
}
else{
if(hasOperation==true){
if("".equals(secStr)){
op = 3;
opStr = "x";
print.setText(firStr + opStr);
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
secondNum = Double.valueOf(secStr).doubleValue();
res = Count(firstNum , secondNum);
if(divNumIsZero==false){
firStr = Double.toString(res);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
op = 3;
opStr = "x";
firstNum = 0;
secStr = "";
secondNum = 0;
print.setText(firStr + opStr);
}
else{
divNumIsZero = false;
}
}
}
else{//在按了等于之后,继续以运算结果为第一个数继续运算
op = 3;
opStr = "x";
print.setText(firStr+opStr);
hasOperation=true;
}
}
hasPoint = false;
hasCount = true;
}
除
//除
public void divClick(View v){
if(isFirstNumEnd==false){
isFirstNumEnd = true;
op = 4;//4 表示 Div
opStr = "/";
print.setText(firStr + opStr);
hasOperation = true;
}
else{
if(hasOperation==true){
if("".equals(secStr)){
op = 4;
opStr = "/";
print.setText(firStr + opStr);
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
secondNum = Double.valueOf(secStr).doubleValue();
res = Count(firstNum , secondNum);
if(divNumIsZero==false){
firStr = Double.toString(res);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
op =4;
opStr = "/";
firstNum = 0;
secStr = "";
secondNum = 0;
print.setText(firStr + opStr);
}
else{
divNumIsZero = false;
}
}
}
else{//在按了等于之后,继续以运算结果为第一个数继续运算
op = 4;
opStr = "/";
print.setText(firStr+opStr);
hasOperation=true;
}
}
hasPoint = false;
hasCount = true;
}
等于
//等于
public void equalClick(View v){
if(isFirstNumEnd == false){
if("".equals(firStr)){
res = 0;
print.setText("0");
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
res = firstNum;
firStr = Double.toString(firstNum);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
print.setText(firStr);
}
isFirstNumEnd = true;
}
else{
if("".equals(secStr)){
firstNum = Double.valueOf(firStr).doubleValue();
res = firstNum;
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
print.setText(firStr);
}
else{
firstNum = Double.valueOf(firStr).doubleValue();
secondNum = Double.valueOf(secStr).doubleValue();
res = Count(firstNum,secondNum);
if(divNumIsZero==false){
firStr = Double.toString(res);
if((double)Math.floor(res)==res){
int res_1 = (int)res;
firStr = String.valueOf(res_1);
}
print.setText(firStr);
}
else{
divNumIsZero=false;
print.setText("0");
clearInfo();
}
}
}
secStr = "";
secondNum = 0;
opStr = "";
op = 0;
hasOperation=false;
hasPoint = false;
hasCount = true;
}
Count(num1, num2)
public double Count(double fir, double sec){
double ans = 0;
switch(op){
case 1:
ans = fir + sec;
break;
case 2:
ans = fir - sec;
break;
case 3:
ans = fir * sec;
break;
case 4:
if(sec!=0){
ans = fir / sec;
divNumIsZero = false;
}
else{
new AlertDialog.Builder(CalcuActivity.this).setTitle("温馨提示")
.setMessage("抱歉,除数不能为0!")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
}).show();
divNumIsZero = true;
}
break;
default:
new AlertDialog.Builder(CalcuActivity.this).setTitle("温馨提示")
.setMessage("抱歉,软件内部发生错误!")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
}).show();
}
return ans;
}
backspace
public void backspaceClick(View v){
if(isFirstNumEnd==false){
if("".equals(firStr)){
print.setText("");
}
else{
firStr = firStr.substring(0, firStr.length()-1);
print.setText(firStr);
}
}
else{
if("".equals(secStr)){
if(hasCount==false){
if(op==0){
firStr = firStr.substring(0,firStr.length()-1);
print.setText(firStr);
}
else{
op=0;
opStr="";
isFirstNumEnd=false;
hasOperation = false;
print.setText(firStr);
}
}
else{
if(op==0){
print.setText(firStr);
}
else{
op=0;
opStr="";
hasOperation = false;
print.setText(firStr);
}
}
}
else{
secStr = secStr.substring(0,secStr.length()-1);
print.setText(firStr+opStr+secStr);
}
}
}
清空事件clearClick()
//清空
public void clearClick(View v){
clearInfo();
print.setText("");
}
clear()
private void clearInfo(){
op=0;
haveResult = false;
isFirstNumEnd =false;
hasCount = false;
hasOperation = false;
hasPoint = false;
firstNum = 0;
secondNum = 0;
res = 0 ;
firStr="";
opStr ="";
secStr="";
divNumIsZero = false;
}
还存在很多BUG,学的太匆忙,写的太匆忙,没有构思好,就直接开写,然后后面写到哪想到哪,导致代码实在是恶心,实在是冗余。。。放在这,看看自己一年后看这个会不会骂:这是哪个SB写的?o(╯□╰)o
后面我会在工作之余的空闲时间继续学习Android以及IOS开发,有木有大神可以给我些学习建议或者有没有人又电子资料可以发我邮箱么(如果你看到了这里,如果你有,非常希望能够得到您的帮助,3QU~~~),邮箱为:jn_aswq@163.com
代码链接:http://download.youkuaiyun.com/detail/jn_aswq/9007557
代码我后面将其上传至优快云上,上传完之后,再来附链接。。。