2014年12月1日15:42:10
by tops
主布局使用LinearLayout,走向为垂直
使用TextView当作显示屏,显示计算结果
使用TableLayout当作输入表格
TableRow是每一行,其中包含四个按键
善用IDE的视图来设计布局也是很节省时间的
加减乘除的英语单词
找到TextView,给按钮直接添加setOnClickListener事件
在MainActivity中实现监听接口并复写onClick方法,在方法里使用switch id的方法判断点击的是哪个按钮;
使用数组或栈记录输入的数字和运算符,当输入第四个运算符时就先计算前面的算式为结果,再计算后面输入的。
创建一个Item类,用来表示数字或运算符,数组就放Item为元素;
当点击数字按键的时候给TextView.append数字,点击加减乘除计算时从TextView.getText并转换为数字,转换为Item类添加到数组中;
然后调用检查并计算的方法
如果数组元素大于3,判断数组中第二个元素是什么运算符,再获取第一个元素和第三个元素作为计算数字进行计算。这时清空数组。
当计算完毕之后将计算结果添加到数组第一个元素。
那么计算小数和计算结果为整数时不要显示小数点都应该优化,思考一下
注:另外一种计算方式就是将输入的内容搞成一个数组,然后在点击等号的时候才开始计算。
本例的缺点是没有回删键,比如输入错了可以往前删一个数字或运算符。
/Calculator/src/com/tops/calculator/MainActivity.java 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="/" />