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)

更多相关文章

  1. Application Fundamentals--Intent 过滤器
  2. Android(安卓)JNI概述
  3. android DES 字符串加密后 解密乱码
  4. Android提高第十八篇之自定义PopupWindow实现的Menu(TabMenu)
  5. android 数字证书
  6. Android(安卓)数字签名学习笔记
  7. Android布局常用控件
  8. 子控件相对于父控件规则显示且不被拉伸的方法
  9. Android数据解析JSON解析之手动JSON解析

随机推荐

  1. JavaFX窗口自适应
  2. JAVA实现二进制和16进制之间的互相转换,8
  3. Java学习之面向对象三
  4. java微信小程序解密AES/CBC/PKCS7Padding
  5. 包含带标记的值的XML属性文件
  6. JAVA实现排序-冒泡排序-优化冒泡排序
  7. 不幸的是,在声明按钮时,模拟器中出现了错误
  8. spark seq.max 报错 Caused by: java.lan
  9. 排序算法之 Java简单快速排序算法
  10. Java正则表达式提取字符