菜鸟瞎搞,高手莫进
本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢?
于是就冒冒失失的开撸了。
简单计算器嘛,功能当然很少,加减乘除就可以。
第一步:设计布局文件
界面如下图:
由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件。
注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本)。
有关GridLayout的相关知识,大家可以参考那些网络大牛没写的博客,这里只是简单应用。
上代码了:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 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 <TextView 16 android:id="@+id/tvScreen" 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 <GridLayout 24 android:layout_width="wrap_content" 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 <Button 32 android:id="@+id/btC" 33 android:text="C" 34 android:textColor="#8b2500" /> 35 36 <Button 37 android:id="@+id/btDelete" 38 android:text="←" 39 android:textColor="#8b2500" /> 40 41 <Button 42 android:id="@+id/btDivide" 43 android:text="÷" 44 android:textColor="#8b2500" /> 45 46 <Button 47 android:id="@+id/btMultiply" 48 android:text="X" 49 android:textColor="#8b2500" /> 50 51 <Button 52 android:id="@+id/bt7" 53 android:text="7" 54 android:textColor="#8b2500" /> 55 56 <Button 57 android:id="@+id/bt8" 58 android:text="8" 59 android:textColor="#8b2500" /> 60 61 <Button 62 android:id="@+id/bt9" 63 android:text="9" 64 android:textColor="#8b2500" /> 65 66 <Button 67 android:id="@+id/btSub" 68 android:text="-" 69 android:textColor="#8b2500" /> 70 71 <Button 72 android:id="@+id/bt4" 73 android:text="4" 74 android:textColor="#8b2500" /> 75 76 <Button 77 android:id="@+id/bt5" 78 android:text="5" 79 android:textColor="#8b2500" /> 80 81 <Button 82 android:id="@+id/bt6" 83 android:text="6" 84 android:textColor="#8b2500" /> 85 86 <Button 87 android:id="@+id/btAdd" 88 android:text="+" 89 android:textColor="#8b2500" /> 90 91 <Button 92 android:id="@+id/bt1" 93 android:text="1" 94 android:textColor="#8b2500" /> 95 96 <Button 97 android:id="@+id/bt2" 98 android:text="2" 99 android:textColor="#8b2500" /> 100 101 <Button 102 android:id="@+id/bt3" 103 android:text="3" 104 android:textColor="#8b2500" /> 105 106 <Button 107 android:id="@+id/btSum" 108 android:layout_gravity="fill" 109 android:layout_rowSpan="2" 110 android:text="=" 111 android:textColor="#8b2500" /> 112 113 <Button 114 android:id="@+id/bt0" 115 android:layout_columnSpan="2" 116 android:layout_gravity="fill" 117 android:text="0" 118 android:textColor="#8b2500" /> 119 120 <Button 121 android:id="@+id/btDot" 122 android:text="." 123 android:textColor="#8b2500" /> 124 GridLayout> 125 <TextView 126 android:id="@+id/tvTest" 127 android:layout_width="fill_parent" 128 android:layout_height="match_parent" 129 android:text="测试版"/> 130 131 LinearLayout>
第二步:编写Java类文件
这里分几个模块来写
(1)0-9 10个按钮的OnClick()事件
(2)+-*/ 10个按钮的OnClick()事件
(3)用于计算的内部类
(4)其他按钮的OnClick()事件
这里就直接把全部代码附上吧:
1 package com.beiyan.study; 2 3 import java.math.BigDecimal; 4 import com.beiyan.study.R.id; 5 import android.R.bool; 6 import android.R.integer; 7 import android.R.string; 8 import android.os.Bundle; 9 import android.support.v7.app.ActionBarActivity; 10 import android.text.style.ClickableSpan; 11 import android.view.Menu; 12 import android.view.MenuItem; 13 import android.view.View; 14 import android.view.View.OnClickListener; 15 import android.widget.Button; 16 import android.widget.TextView; 17 import android.widget.Toast; 18 19 public class MainActivity extends ActionBarActivity { 20 21 // [start] 定义按钮 22 // 定义textView 23 private TextView 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 = new Button[btNumId.length]; 30 31 // +-*/,清除,回退 Dot按钮定义 32 private Button btAdd; 33 private Button btSub; 34 private Button btMult; 35 private Button btDiv; 36 private Button btSum; 37 private Button btC; 38 private Button btBack; 39 private Button 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 @Override 52 protected void onCreate(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(new btNumClick() { 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(new btCalculClick() { 76 }); 77 btSub.setOnClickListener(new btCalculClick() { 78 }); 79 btMult.setOnClickListener(new btCalculClick() { 80 }); 81 btDiv.setOnClickListener(new btCalculClick() { 82 }); 83 // = 按钮设置OnClick()事件 84 btSum.setOnClickListener(new OnClickListener() { 85 @Override 86 public void onClick(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 = new calculFun(); 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(new OnClickListener() { 105 @Override 106 public void onClick(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 = new StringBuffer(); 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(new OnClickListener() { 125 @Override 126 public void onClick(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(new OnClickListener() { 140 141 @Override 142 public void onClick(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 @Override 155 public boolean onCreateOptionsMenu(Menu menu) { 156 getMenuInflater().inflate(R.menu.main, menu); 157 return true; 158 } 159 160 @Override 161 public boolean onOptionsItemSelected(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 implements OnClickListener { 171 @Override 172 public void onClick(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 class calculFun { 191 private String calculFun(String str1, String str2, int n) { 192 BigDecimal bigDecimal1 = new BigDecimal(str1); 193 BigDecimal bigDecimal2 = new BigDecimal(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 return bigDecimalsum.toString(); 221 } 222 } 223 224 // 定义一个内部类,继承自OnClickListener,用于+-*/按钮的点击事件 225 class btCalculClick implements OnClickListener { 226 227 @Override 228 public void onClick(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 case R.id.btAdd: 239 calculFlg = 1; 240 break; 241 case R.id.btSub: 242 calculFlg = 2; 243 break; 244 case R.id.btMultiply: 245 calculFlg = 3; 246 break; 247 case R.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 case R.id.btAdd: 261 calculFlg = 1; 262 break; 263 case R.id.btSub: 264 calculFlg = 2; 265 break; 266 case R.id.btMultiply: 267 calculFlg = 3; 268 break; 269 case R.id.btDivide: 270 calculFlg = 4; 271 break; 272 default: 273 break; 274 } 275 } else { 276 stringNum2 = tv.getText().toString().trim(); 277 calculFun calcul = new calculFun(); 278 stringNum1 = calcul.calculFun(stringNum1, stringNum2, 279 calculFlg); 280 stringNum2 = ""; 281 tv.setText(stringNum1); 282 switch (((Button) v).getId()) { 283 case R.id.btAdd: 284 calculFlg = 1; 285 break; 286 case R.id.btSub: 287 calculFlg = 2; 288 break; 289 case R.id.btMultiply: 290 calculFlg = 3; 291 break; 292 case R.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)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。