菜鸟学Android编程——简单计算器《一》

 

菜鸟瞎搞,高手莫进

 

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

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

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

第一步:设计布局文件

界面如下图:

 

菜鸟学Android编程——简单计算器《一》_第1张图片

由于刚开始学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)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。

 

转载于:https://www.cnblogs.com/beiyan/p/4217490.html

你可能感兴趣的:(菜鸟学Android编程——简单计算器《一》)