菜鸟瞎搞,高手莫进

本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢?

于是就冒冒失失的开撸了。

简单计算器嘛,功能当然很少,加减乘除就可以。

第一步:设计布局文件

界面如下图:

由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件。

注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本)。

有关GridLayout的相关知识,大家可以参考那些网络大牛没写的博客,这里只是简单应用。

上代码了:

1

2 xmlns:tools="http://schemas.android.com/tools"

3 android:layout_width="match_parent"

4 android:layout_height="match_parent"

5 android:orientation="vertical"

6

7 android:paddingBottom="@dimen/activity_vertical_margin"

8 android:paddingLeft="@dimen/activity_horizontal_margin"

9 android:paddingRight="@dimen/activity_horizontal_margin"

10 android:paddingTop="@dimen/activity_vertical_margin"

11 tools:context="com.beiyan.study.MainActivity" >

12

13

14

15

17 android:layout_width="fill_parent"

18 android:layout_height="wrap_content"

19 android:layout_gravity="right"

20 android:textColor="#2e8b57"

21 android:textSize="30dp" />

22

23

25 android:layout_height="wrap_content"

26 android:layout_gravity="fill_horizontal"

27 android:layout_marginLeft="5dp"

28 android:columnCount="4"

29 android:rowCount="5" >

30

31

33 android:text="C"

34 android:textColor="#8b2500" />

35

36

38 android:text="←"

39 android:textColor="#8b2500" />

40

41

43 android:text="÷"

44 android:textColor="#8b2500" />

45

46

48 android:text="X"

49 android:textColor="#8b2500" />

50

51

53 android:text="7"

54 android:textColor="#8b2500" />

55

56

58 android:text="8"

59 android:textColor="#8b2500" />

60

61

63 android:text="9"

64 android:textColor="#8b2500" />

65

66

68 android:text="-"

69 android:textColor="#8b2500" />

70

71

73 android:text="4"

74 android:textColor="#8b2500" />

75

76

78 android:text="5"

79 android:textColor="#8b2500" />

80

81

83 android:text="6"

84 android:textColor="#8b2500" />

85

86

88 android:text="+"

89 android:textColor="#8b2500" />

90

91

93 android:text="1"

94 android:textColor="#8b2500" />

95

96

98 android:text="2"

99 android:textColor="#8b2500" />

100

101

103 android:text="3"

104 android:textColor="#8b2500" />

105

106

108 android:layout_gravity="fill"

109 android:layout_rowSpan="2"

110 android:text="="

111 android:textColor="#8b2500" />

112

113

115 android:layout_columnSpan="2"

116 android:layout_gravity="fill"

117 android:text="0"

118 android:textColor="#8b2500" />

119

120

122 android:text="."

123 android:textColor="#8b2500" />

124

125

127 android:layout_width="fill_parent"

128 android:layout_height="match_parent"

129 android:text="测试版"/>

130

131

第二步:编写Java类文件

这里分几个模块来写

(1)0-9    10个按钮的OnClick()事件

(2)+-*/  10个按钮的OnClick()事件

(3)用于计算的内部类

(4)其他按钮的OnClick()事件

这里就直接把全部代码附上吧:

1 packagecom.beiyan.study;2

3 importjava.math.BigDecimal;4 importcom.beiyan.study.R.id;5 importandroid.R.bool;6 importandroid.R.integer;7 importandroid.R.string;8 importandroid.os.Bundle;9 importandroid.support.v7.app.ActionBarActivity;10 importandroid.text.style.ClickableSpan;11 importandroid.view.Menu;12 importandroid.view.MenuItem;13 importandroid.view.View;14 importandroid.view.View.OnClickListener;15 importandroid.widget.Button;16 importandroid.widget.TextView;17 importandroid.widget.Toast;18

19 public class MainActivity extendsActionBarActivity {20

21 //[start] 定义按钮22 //定义textView

23 privateTextView tv;24 //private TextView tvTest;25

26 //0-9 数字键定义

27 private int[] btNumId ={ R.id.bt0, R.id.bt1, R.id.bt2, R.id.bt3, R.id.bt4,28 R.id.bt5, R.id.bt6, R.id.bt7, R.id.bt8, R.id.bt9 };29 private Button[] buttonNums = newButton[btNumId.length];30

31 //+-*/,清除,回退 Dot按钮定义

32 privateButton btAdd;33 privateButton btSub;34 privateButton btMult;35 privateButton btDiv;36 privateButton btSum;37 privateButton btC;38 privateButton btBack;39 privateButton btDot;40

41 //定义全局变量

42 private String stringNum1 = ""; //第一个运算数

43 private String stringNum2 = ""; //第二个运算数

44

45 private byte numFlg = 0; //用于指示是否开始一个新的输入

46 private byte calculFlg = 0; //用于表示输入的运算符

47 private int firstFlg = 0; //指示第一个数是输入完成48

49 //[end]

50

51 @Override52 protected voidonCreate(Bundle savedInstanceState) {53 super.onCreate(savedInstanceState);54 setContentView(R.layout.activity_main);55 //设置各个按钮

56 for (int i = 0; i < btNumId.length; i++) {57 buttonNums[i] =(Button) findViewById(btNumId[i]);58 //设置OnClick()事件

59 buttonNums[i].setOnClickListener(newbtNumClick() {60 });61 }62 btAdd =(Button) findViewById(R.id.btAdd);63 btSub =(Button) findViewById(R.id.btSub);64 btMult =(Button) findViewById(R.id.btMultiply);65 btDiv =(Button) findViewById(R.id.btDivide);66 btSum =(Button) findViewById(R.id.btSum);67

68 btC =(Button) findViewById(R.id.btC);69 btBack =(Button) findViewById(R.id.btDelete);70

71 btDot =(Button) findViewById(R.id.btDot);72 tv =(TextView) findViewById(R.id.tvScreen);73 //tvTest = (TextView) findViewById(R.id.tvTest);

74 tv.setText("0");75 btAdd.setOnClickListener(newbtCalculClick() {76 });77 btSub.setOnClickListener(newbtCalculClick() {78 });79 btMult.setOnClickListener(newbtCalculClick() {80 });81 btDiv.setOnClickListener(newbtCalculClick() {82 });83 //= 按钮设置OnClick()事件

84 btSum.setOnClickListener(newOnClickListener() {85 @Override86 public voidonClick(View v) {87 if (firstFlg == 0) {88 stringNum1 =tv.getText().toString().trim();89 firstFlg = 1;90 } else{91 stringNum2 =tv.getText().toString().trim();92 calculFun calcul = newcalculFun();93 stringNum1 =calcul.calculFun(stringNum1, stringNum2,94 calculFlg);95 tv.setText(stringNum1);96 stringNum2 = "";97 firstFlg = 0;98 calculFlg = 0;99 }100 }101 });102

103 //Back键设置OnClick()事件

104 btBack.setOnClickListener(newOnClickListener() {105 @Override106 public voidonClick(View v) {107 String strTem =tv.getText().toString();108 if (strTem.length() == 1)109 tv.setText("0");110 else{111 String strTarget;112 StringBuffer sb = newStringBuffer();113 char[] charTem =strTem.toCharArray();114 for (int i = 0; i < charTem.length - 1; i++) {115 sb.append(charTem[i]);116 }117 strTarget =sb.toString();118 tv.setText(strTarget);119 }120 }121 });122

123 //dot 按键设置OnClick()事件

124 btDot.setOnClickListener(newOnClickListener() {125 @Override126 public voidonClick(View v) {127 char[] charTem =tv.getText().toString().trim().toCharArray();128 int n = 0;129 for (int i = 0; i < charTem.length; i++) {130 if (charTem[i] == '.')131 n++;132 }133 if (n == 0)134 tv.setText(tv.getText().toString().trim() + ".");135 }136 });137

138 //C键设置OnClick()事件

139 btC.setOnClickListener(newOnClickListener() {140

141 @Override142 public voidonClick(View v) {143 tv.setText("0");144 stringNum1 = "";145 stringNum2 = "";146 numFlg = 0;147 firstFlg = 0;148 calculFlg = 0;149 }150 });151

152 }153

154 @Override155 public booleanonCreateOptionsMenu(Menu menu) {156 getMenuInflater().inflate(R.menu.main, menu);157 return true;158 }159

160 @Override161 public booleanonOptionsItemSelected(MenuItem item) {162 int id =item.getItemId();163 if (id ==R.id.action_settings) {164 return true;165 }166 return super.onOptionsItemSelected(item);167 }168

169 //定义一个内部类,继承自OnClickListener,用于0-9按钮的点击事件

170 class btNumClick implementsOnClickListener {171 @Override172 public voidonClick(View v) {173 //tvTest.setText(((Button) v).getText().toString().trim() + " "174 //+ tv.getText().toString().trim());

175 if (numFlg == 0) {176 if (tv.getText().toString().trim().equals("0")) {177 tv.setText(((Button) v).getText().toString().trim());178 } else{179 tv.setText(tv.getText().toString().trim()180 +((Button) v).getText().toString().trim());181 }182 } else{183 tv.setText(((Button) v).getText().toString().trim());184 numFlg = 0;185 }186 }187 }188

189 //定义一个内部类,用于计算两个BigDecimal类型数据的四则运算

190 classcalculFun {191 private String calculFun(String str1, String str2, intn) {192 BigDecimal bigDecimal1 = newBigDecimal(str1);193 BigDecimal bigDecimal2 = newBigDecimal(str2);194 BigDecimal bigDecimalsum = new BigDecimal("0");195 switch(n) {196 case 1:197 bigDecimalsum =bigDecimal1.add(bigDecimal2);198 break;199 case 2:200 bigDecimalsum =bigDecimal1.subtract(bigDecimal2);201 break;202 case 3:203 bigDecimalsum =bigDecimal1.multiply(bigDecimal2);204 break;205 case 4: {206 //除数不能为零,加一个判断

207 if (stringNum2.equals("0")) {208 Toast.makeText(getApplicationContext(), "除数不能为0哟",209 Toast.LENGTH_SHORT).show();210 tv.setText("0");211

212 return "0";213 } else

214 bigDecimalsum =bigDecimal1.divide(bigDecimal2);215 }216 break;217 default:218 break;219 }220 returnbigDecimalsum.toString();221 }222 }223

224 //定义一个内部类,继承自OnClickListener,用于+-*/按钮的点击事件

225 class btCalculClick implementsOnClickListener {226

227 @Override228 public voidonClick(View v) {229 if (numFlg == 1) {230 stringNum1 =tv.getText().toString().trim();231 firstFlg = 1;232 if (calculFlg == 4 || calculFlg == 1 || calculFlg == 2

233 || calculFlg == 3)234 numFlg = 1;235 else

236 numFlg = 0;237 switch(((Button) v).getId()) {238 caseR.id.btAdd:239 calculFlg = 1;240 break;241 caseR.id.btSub:242 calculFlg = 2;243 break;244 caseR.id.btMultiply:245 calculFlg = 3;246 break;247 caseR.id.btDivide:248 calculFlg = 4;249 break;250 default:251 break;252 }253 } else{254 if (firstFlg == 0) {255

256 stringNum1 =tv.getText().toString().trim();257 firstFlg = 1;258 numFlg = 1;259 switch(((Button) v).getId()) {260 caseR.id.btAdd:261 calculFlg = 1;262 break;263 caseR.id.btSub:264 calculFlg = 2;265 break;266 caseR.id.btMultiply:267 calculFlg = 3;268 break;269 caseR.id.btDivide:270 calculFlg = 4;271 break;272 default:273 break;274 }275 } else{276 stringNum2 =tv.getText().toString().trim();277 calculFun calcul = newcalculFun();278 stringNum1 =calcul.calculFun(stringNum1, stringNum2,279 calculFlg);280 stringNum2 = "";281 tv.setText(stringNum1);282 switch(((Button) v).getId()) {283 caseR.id.btAdd:284 calculFlg = 1;285 break;286 caseR.id.btSub:287 calculFlg = 2;288 break;289 caseR.id.btMultiply:290 calculFlg = 3;291 break;292 caseR.id.btDivide:293 calculFlg = 4;294 break;295 default:296 break;297 }298 firstFlg = 1;299 numFlg = 1;300 }301 }302 }303

304 }305 }

这里也附上生成好的apk文件,百度网盘下载地址(还没找到博客上面怎么添加附件)

http://pan.baidu.com/s/1gdd7b5x

第三步:总结遇到的问题

(1)第一个问题是 "==" 与equals() 的区别

在这个问题上卡了好久,这里简单说一下吧(个人理解)

当进行两个变量比较时:

"=="  用于byte,short,char,int,long,float,double,boolean基本类型的比较

equals() 用于String等符合类型的比较

简单例子:

int num1=123;int num2=123;

System.out.println("1 "+(num1==num2));

String str1="123";

String str2=new String("123");

System.out.println("2 "+(str1==str2));

System.out.println("3 "+(str1.equals(str2)));

结果是:

1      true

2  false

3   true

第二个判断和第三个判断 所表示的值是一样的,为什么结果却不同呢?

本人的理解,不知道对错,欢迎大家指正

对于基本数据类型的比较,没有equals(),只有“==”

所以“==”是比较两个变量所占用的存储地址(或者其他)是否相同,上例中 num1和num2虽然变量名不同,但是所表示的值相同,所以在数据集中两个变量存储在一个位置。所以比较结果为true。

对于equals() ,用来比较复杂数据类型的表示的值是否相同,只要两个变量所表示的值一样,就显示为true。上例中,str1和str2,值相同,但存储地址不同,所以出现不同的结果。

关于“==”和equals() 更详尽的解释,参考http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

http://blog.csdn.net/winer2008/article/details/4059789

(2)第二个问题是程序流程的问题。

刚开始时,对整个计算器的流程不是很能把握,花了好长时间,才弄好。

这里想对自己说

写程序最重要的是算法流程,动手写代码之前一定要在心里或者纸上有一个详尽的流程。

第四步:下一步改进的方向

(1)由于对布局不是很熟悉,导致所采用的布局不是很合理。在大屏手机上面程序不会进行相应的拉伸,显得很突兀。

(2)只有简单的加减乘除,以后争取实现平时所用的科学计算器的功能。

(3)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。

java安卓编程计算器_菜鸟学Android编程——简单计算器《一》相关推荐

  1. 灵宝机器人编程学校_南宁学机器人编程的学校

    南宁学机器人编程的学校|可来南宁童程童美青少儿编程培训学校,童程童美在南宁青秀区.西乡塘区等开设校区,线下可学编程,线上也可学习,线上线下同步教学,方便家长选择.南宁童程童美设有试听课,欢迎广大家长预 ...

  2. python计算器_使用python实现一个简单计算器

    之前写过一系列的tkinter库控件的使用方法以及tkinter的三种布局方法. 但是并没有做过什么实际的案例,主要原因是因为使用tikinter做界面比较麻烦,没有可视化的设计来的快,就像我之前用的 ...

  3. 菜鸟学Android源码——Setting(1)

    菜鸟学Android源码--Setting(1) 在上一篇中,我简单介绍了Android源码的下载和编译,还没有下载编译源码的小伙伴请看这里:Android源码分析之--下载并编译源码 关于系统设置A ...

  4. 电脑用java怎么编程,使用java编程从0到1实现一个简单计算器

    学习编程语言最重要的就是实践.很多小伙伴在学习完编程语言后,一直停留在基础阶段,只懂一大堆理论知识,而不懂得实践.那么,今天我们一起来动手做一个小计算器,回顾下学习过的知识,同时这也是很多大学计算机专 ...

  5. 菜鸟能学python编程,菜鸟学Python编程文章阅读记录一

    菜鸟学Python编程文章阅读记录 看的懵懵懂懂,感觉就是要把代码看懂到,这个代码块做了什么功能,了解到建了属性,定义了方法,这些方法与属性的关系 今天是js逆向专题,这个帖子,回头再好好看 回头再找 ...

  6. Android开发——简单计算器实现

    计算器项目,要求实现加.减.乘.除.求倒数.求平方根等简单运算. 真机调试结果如下图: 布局文件:main_activity.xml <?xml version="1.0" ...

  7. PTA 基础编程题目集 7-12 两个数的简单计算器 C语言

    PTA 基础编程题目集 7-12 两个数的简单计算器 C语言 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式 ...

  8. 新疆有没有教电脑编程C语言,新疆学习电脑编程,新疆学电脑编程哪里好,新疆学电脑编程效果怎么样...

    新疆学习电脑编程,新疆学电脑编程哪里好,新疆学电脑编程效果怎么样 首页 > 软件 > 新疆学习电脑编程 作者:镀金池   发布时间:2018-11-02 20:40 客岁年末,微软再次发力 ...

  9. 昆山学python_昆山学习电脑编程,昆山学电脑编程哪里好,昆山学电脑编程一般能拿多少工资...

    昆山学习电脑编程,昆山学电脑编程哪里好,昆山学电脑编程一般能拿多少工资 首页 > 软件 > 昆山学习电脑编程 作者:镀金池   发布时间:2018-08-10 16:20 将后缀名为.bu ...

最新文章

  1. 浅谈MySQL存储引擎-InnoDBMyISAM
  2. 为什么servlet-nameaction/servlet-name要这么写
  3. 【SmartJob】【隔离装置】WEB/统计程序和隔离程序共享服务器时的JAVA版本冲突问题
  4. hades武器第四形态解锁_凯多的第四个技能预告——冰冻!
  5. WPF任务栏同步进度
  6. vue变量传值_Vue各类组件之间传值的实现方式
  7. echarts的dataZoom属性在移动端 h5+环境中无法左右滑动问题
  8. excel两个指标相关性分析_我用Excel发现了数据分析的本质:回归分析
  9. 添加git 忽略文件
  10. 华为视频会议系统常见问题及解决方法
  11. python——item()返回可遍历的(键,值)元组数据
  12. 计算机体检作用,QQ电脑管家什么是电脑体检?有什么作用?
  13. html中li的圆点,CSS中li圆点样式
  14. conda failed to create process
  15. DES子密钥计算具体步骤
  16. Shell 脚本的详细解读 (三)
  17. 机器学习中的random_state参数
  18. REORG TABLE命令优化数据库性能
  19. 重庆理工计算机考研分数线,重庆理工大学研究生录取分数线
  20. (转)理论经典:TCP协议的3次握手与4次挥手过程详解

热门文章

  1. 计算机管理器为什么没有本地用户和组,windows7系统服务器管理器没有“本地用户和组”选项解决方法...
  2. win10 Ubuntu双系统 + 固态硬盘升级 (暗影精灵3)
  3. 炫云云模型收费模型免费下载
  4. ictclas java版_10分钟开始使用ICTCLAS Java版
  5. 视频太大不能发微信怎么办
  6. Gabor滤波器学习 综合多篇关于Gabor滤波器的博客总结
  7. python类变量和实例变量的区别
  8. c java gif 夺宝奇兵_java游戏:将GIF转 字符GIF
  9. G711 G723 G729,带宽计算
  10. SAP后台变式查找以及根据变式找到事务码