首页 > 代码库 > Android -计算器的实现

Android -计算器的实现

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

  1. /**
  2. *
  3. * 10+20-8=
  4. *
  5. */
  6. package com.tops.calculator;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.view.Menu;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.TextView;
  15. public class MainActivity extends Activity implements OnClickListener {
  16. private TextView tvScreen;
  17. private List items = new ArrayList();
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. // 第一步,寻找控件并给按钮添加监听事件
  23. tvScreen = (TextView) findViewById(R.id.tvScreen);
  24. findViewById(R.id.btn0).setOnClickListener(this);
  25. findViewById(R.id.btn1).setOnClickListener(this);
  26. findViewById(R.id.btn2).setOnClickListener(this);
  27. findViewById(R.id.btn3).setOnClickListener(this);
  28. findViewById(R.id.btn4).setOnClickListener(this);
  29. findViewById(R.id.btn5).setOnClickListener(this);
  30. findViewById(R.id.btn6).setOnClickListener(this);
  31. findViewById(R.id.btn7).setOnClickListener(this);
  32. findViewById(R.id.btn8).setOnClickListener(this);
  33. findViewById(R.id.btn9).setOnClickListener(this);
  34. findViewById(R.id.btnX).setOnClickListener(this);
  35. findViewById(R.id.btnAdd).setOnClickListener(this);
  36. findViewById(R.id.btnSub).setOnClickListener(this);
  37. findViewById(R.id.btnResult).setOnClickListener(this);
  38. findViewById(R.id.btnClear).setOnClickListener(this);
  39. findViewById(R.id.btnDiv).setOnClickListener(this);
  40. }
  41. /**
  42. * 复写OnClickListener接口的onClick方法,用来判断输入
  43. */
  44. @Override
  45. public void onClick(View v) {
  46. switch (v.getId()) {
  47. case R.id.btn0:
  48. tvScreen.append("0");
  49. break;
  50. case R.id.btn1:
  51. tvScreen.append("1");
  52. break;
  53. case R.id.btn2:
  54. tvScreen.append("2");
  55. break;
  56. case R.id.btn3:
  57. tvScreen.append("3");
  58. break;
  59. case R.id.btn4:
  60. tvScreen.append("4");
  61. break;
  62. case R.id.btn5:
  63. tvScreen.append("5");
  64. break;
  65. case R.id.btn6:
  66. tvScreen.append("6");
  67. break;
  68. case R.id.btn7:
  69. tvScreen.append("7");
  70. break;
  71. case R.id.btn8:
  72. tvScreen.append("8");
  73. break;
  74. case R.id.btn9:
  75. tvScreen.append("9");
  76. break;
  77. // 点击加号按钮
  78. case R.id.btnAdd:
  79. // 给数组添加数字元素
  80. items.add(new Item(Double
  81. .parseDouble(tvScreen.getText().toString()), Types.NUM));
  82. // 检查是否可以计算,如果可以则进行计算
  83. checkAndCompute();
  84. // 给数组添加加号运算符
  85. items.add(new Item(0, Types.ADD));
  86. // 清空显示屏
  87. tvScreen.setText("");
  88. break;
  89. case R.id.btnSub:
  90. items.add(new Item(Double
  91. .parseDouble(tvScreen.getText().toString()), Types.NUM));
  92. checkAndCompute();
  93. items.add(new Item(0, Types.SUB));
  94. tvScreen.setText("");
  95. break;
  96. case R.id.btnX:
  97. items.add(new Item(Double
  98. .parseDouble(tvScreen.getText().toString()), Types.NUM));
  99. checkAndCompute();
  100. items.add(new Item(0, Types.X));
  101. tvScreen.setText("");
  102. break;
  103. case R.id.btnDiv:
  104. items.add(new Item(Double
  105. .parseDouble(tvScreen.getText().toString()), Types.NUM));
  106. checkAndCompute();
  107. items.add(new Item(0, Types.DIV));
  108. tvScreen.setText("");
  109. break;
  110. // 点击清楚屏幕按钮,显示屏清空,计算的数组清空
  111. case R.id.btnClear:
  112. tvScreen.setText("");
  113. items.clear();
  114. break;
  115. // 点击等号按钮,计算并显示结果,数组清空
  116. case R.id.btnResult:
  117. items.add(new Item(Double
  118. .parseDouble(tvScreen.getText().toString()), Types.NUM));
  119. checkAndCompute();
  120. tvScreen.setText(items.get(0).value + "");
  121. items.clear();
  122. break;
  123. }
  124. }
  125. /**
  126. * 检查数组的内容是否可以计算,如果可以就计算
  127. */
  128. public void checkAndCompute() {
  129. if (items.size() >= 3) {
  130. double a = items.get(0).value;
  131. double b = items.get(2).value;
  132. int opt = items.get(1).type;
  133. items.clear();
  134. switch (opt) {
  135. case Types.ADD:
  136. items.add(new Item(a + b, Types.NUM));
  137. break;
  138. case Types.SUB:
  139. items.add(new Item(a - b, Types.NUM));
  140. break;
  141. case Types.X:
  142. items.add(new Item(a * b, Types.NUM));
  143. break;
  144. case Types.DIV:
  145. items.add(new Item(a / b, Types.NUM));
  146. break;
  147. }
  148. }
  149. }
  150. @Override
  151. public boolean onCreateOptionsMenu(Menu menu) {
  152. // Inflate the menu; this adds items to the action bar if it is present.
  153. getMenuInflater().inflate(R.menu.main, menu);
  154. return true;
  155. }
  156. }

/Calculator/src/com/tops/calculator/Item.java

  1. package com.tops.calculator;
  2. public class Item {
  3. public Item(double value,int type) {
  4. this.value= value;
  5. this.type=type;
  6. }
  7. public double value = 0;
  8. public int type = 0;
  9. }

/Calculator/src/com/tops/calculator/Types.java

  1. package com.tops.calculator;
  2. public class Types {
  3. public static final int ADD = 1;
  4. public static final int SUB = 2;
  5. public static final int X = 3;
  6. public static final int DIV = 4;
  7. public static final int NUM = 5;
  8. }

/Calculator/res/layout/activity_main.xml

  1. xmlns:tools="http://schemas.android.com/tools"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical" >
  5. android:id="@+id/tvScreen"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. android:text=""
  9. android:gravity="right"
  10. android:textAppearance="?android:attr/textAppearanceLarge" />
  11. android:layout_width="fill_parent"
  12. android:layout_height="wrap_content"
  13. android:layout_weight="1" >
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content" >
  16. android:id="@+id/btn1"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_weight="1"
  20. android:text="1" />
  21. android:id="@+id/btn2"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:layout_weight="1"
  25. android:text="2" />
  26. android:id="@+id/btn3"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:layout_weight="1"
  30. android:text="3" />
  31. android:id="@+id/btnAdd"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:layout_weight="1"
  35. android:text="+" />
  36. android:layout_width="fill_parent"
  37. android:layout_height="wrap_content" >
  38. android:id="@+id/btn4"
  39. android:layout_width="wrap_content"
  40. android:layout_height="wrap_content"
  41. android:layout_weight="1"
  42. android:text="4" />
  43. android:id="@+id/btn5"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:layout_weight="1"
  47. android:text="5" />
  48. android:id="@+id/btn6"
  49. android:layout_width="wrap_content"
  50. android:layout_height="wrap_content"
  51. android:layout_weight="1"
  52. android:text="6" />
  53. android:id="@+id/btnSub"
  54. android:layout_width="wrap_content"
  55. android:layout_height="wrap_content"
  56. android:layout_weight="1"
  57. android:text="-" />
  58. android:layout_width="fill_parent"
  59. android:layout_height="wrap_content" >
  60. android:id="@+id/btn7"
  61. android:layout_width="wrap_content"
  62. android:layout_height="wrap_content"
  63. android:layout_weight="1"
  64. android:text="7" />
  65. android:id="@+id/btn8"
  66. android:layout_width="wrap_content"
  67. android:layout_height="wrap_content"
  68. android:layout_weight="1"
  69. android:text="8" />
  70. android:id="@+id/btn9"
  71. android:layout_width="wrap_content"
  72. android:layout_height="wrap_content"
  73. android:layout_weight="1"
  74. android:text="9" />
  75. android:id="@+id/btnX"
  76. android:layout_width="wrap_content"
  77. android:layout_height="wrap_content"
  78. android:layout_weight="1"
  79. android:text="*" />
  80. android:layout_width="fill_parent"
  81. android:layout_height="wrap_content" >
  82. android:id="@+id/btnClear"
  83. android:layout_width="wrap_content"
  84. android:layout_height="wrap_content"
  85. android:layout_weight="1"
  86. android:text="C" />
  87. android:id="@+id/btn0"
  88. android:layout_width="wrap_content"
  89. android:layout_height="wrap_content"
  90. android:layout_weight="1"
  91. android:text="0" />
  92. android:id="@+id/btnResult"
  93. android:layout_width="wrap_content"
  94. android:layout_height="wrap_content"
  95. android:layout_weight="1"
  96. android:text="=" />
  97. android:id="@+id/btnDiv"
  98. android:layout_width="wrap_content"
  99. android:layout_height="wrap_content"
  100. android:layout_weight="1"
  101. android:text="/" />


来自为知笔记(Wiz)


Android -计算器的实现