Android 科学计算器
2014年12月1日15:42:10
by tops
思路:
1、布局
主布局使用LinearLayout,走向为垂直
使用TextView当作显示屏,显示计算结果
使用TableLayout当作输入表格
TableRow是每一行,其中包含四个按键
善用IDE的视图来设计布局也是很节省时间的
加减乘除的英语单词
2、代码
找到TextView,给按钮直接添加setOnClickListener事件
在MainActivity中实现监听接口并复写onClick方法,在方法里使用switch id的方法判断点击的是哪个按钮;
3、计算
使用数组或栈记录输入的数字和运算符,当输入第四个运算符时就先计算前面的算式为结果,再计算后面输入的。
创建一个Item类,用来表示数字或运算符,数组就放Item为元素;
当点击数字按键的时候给TextView.append数字,点击加减乘除计算时从TextView.getText并转换为数字,转换为Item类添加到数组中;
然后调用检查并计算的方法
如果数组元素大于3,判断数组中第二个元素是什么运算符,再获取第一个元素和第三个元素作为计算数字进行计算。这时清空数组。
当计算完毕之后将计算结果添加到数组第一个元素。
那么计算小数和计算结果为整数时不要显示小数点都应该优化,思考一下
注:另外一种计算方式就是将输入的内容搞成一个数组,然后在点击等号的时候才开始计算。
本例的缺点是没有回删键,比如输入错了可以往前删一个数字或运算符。
代码:
/Calculator/src/com/tops/calculator/MainActivity.java
/**
*
* 10+20-8=
*
*/
package com.tops.calculator;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView tvScreen;
private List items = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 第一步,寻找控件并给按钮添加监听事件
tvScreen = (TextView) findViewById(R.id.tvScreen);
findViewById(R.id.btn0).setOnClickListener(this);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
findViewById(R.id.btn5).setOnClickListener(this);
findViewById(R.id.btn6).setOnClickListener(this);
findViewById(R.id.btn7).setOnClickListener(this);
findViewById(R.id.btn8).setOnClickListener(this);
findViewById(R.id.btn9).setOnClickListener(this);
findViewById(R.id.btnX).setOnClickListener(this);
findViewById(R.id.btnAdd).setOnClickListener(this);
findViewById(R.id.btnSub).setOnClickListener(this);
findViewById(R.id.btnResult).setOnClickListener(this);
findViewById(R.id.btnClear).setOnClickListener(this);
findViewById(R.id.btnDiv).setOnClickListener(this);
}
/**
* 复写OnClickListener接口的onClick方法,用来判断输入
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn0:
tvScreen.append("0");
break;
case R.id.btn1:
tvScreen.append("1");
break;
case R.id.btn2:
tvScreen.append("2");
break;
case R.id.btn3:
tvScreen.append("3");
break;
case R.id.btn4:
tvScreen.append("4");
break;
case R.id.btn5:
tvScreen.append("5");
break;
case R.id.btn6:
tvScreen.append("6");
break;
case R.id.btn7:
tvScreen.append("7");
break;
case R.id.btn8:
tvScreen.append("8");
break;
case R.id.btn9:
tvScreen.append("9");
break;
// 点击加号按钮
case R.id.btnAdd:
// 给数组添加数字元素
items.add(new Item(Double
.parseDouble(tvScreen.getText().toString()), Types.NUM));
// 检查是否可以计算,如果可以则进行计算
checkAndCompute();
// 给数组添加加号运算符
items.add(new Item(0, Types.ADD));
// 清空显示屏
tvScreen.setText("");
break;
case R.id.btnSub:
items.add(new Item(Double
.parseDouble(tvScreen.getText().toString()), Types.NUM));
checkAndCompute();
items.add(new Item(0, Types.SUB));
tvScreen.setText("");
break;
case R.id.btnX:
items.add(new Item(Double
.parseDouble(tvScreen.getText().toString()), Types.NUM));
checkAndCompute();
items.add(new Item(0, Types.X));
tvScreen.setText("");
break;
case R.id.btnDiv:
items.add(new Item(Double
.parseDouble(tvScreen.getText().toString()), Types.NUM));
checkAndCompute();
items.add(new Item(0, Types.DIV));
tvScreen.setText("");
break;
// 点击清楚屏幕按钮,显示屏清空,计算的数组清空
case R.id.btnClear:
tvScreen.setText("");
items.clear();
break;
// 点击等号按钮,计算并显示结果,数组清空
case R.id.btnResult:
items.add(new Item(Double
.parseDouble(tvScreen.getText().toString()), Types.NUM));
checkAndCompute();
tvScreen.setText(items.get(0).value + "");
items.clear();
break;
}
}
/**
* 检查数组的内容是否可以计算,如果可以就计算
*/
public void checkAndCompute() {
if (items.size() >= 3) {
double a = items.get(0).value;
double b = items.get(2).value;
int opt = items.get(1).type;
items.clear();
switch (opt) {
case Types.ADD:
items.add(new Item(a + b, Types.NUM));
break;
case Types.SUB:
items.add(new Item(a - b, Types.NUM));
break;
case Types.X:
items.add(new Item(a * b, Types.NUM));
break;
case Types.DIV:
items.add(new Item(a / b, Types.NUM));
break;
}
}
}
@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;
}
}
/Calculator/src/com/tops/calculator/Item.java
package com.tops.calculator;
public class Item {
public Item(double value,int type) {
this.value= value;
this.type=type;
}
public double value = 0;
public int type = 0;
}
/Calculator/src/com/tops/calculator/Types.java
package com.tops.calculator;
public class Types {
public static final int ADD = 1;
public static final int SUB = 2;
public static final int X = 3;
public static final int DIV = 4;
public static final int NUM = 5;
}
/Calculator/res/layout/activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@+id/tvScreen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:gravity="right"
android:textAppearance="?android:attr/textAppearanceLarge" />
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2" />
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="3" />
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="+" />
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
android:id="@+id/btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="4" />
android:id="@+id/btn5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="5" />
android:id="@+id/btn6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="6" />
android:id="@+id/btnSub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="-" />
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
android:id="@+id/btn7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="7" />
android:id="@+id/btn8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="8" />
android:id="@+id/btn9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="9" />
android:id="@+id/btnX"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="*" />
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="C" />
android:id="@+id/btn0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0" />
android:id="@+id/btnResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="=" />
android:id="@+id/btnDiv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="/" />