首页 > 代码库 > 菜鸟学Android编程——简单计算器《一》

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

 

菜鸟瞎搞,高手莫进

 

本人菜鸟一枚,最近在学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         <Button102             android:id="@+id/bt3"103             android:text="3"104             android:textColor="#8b2500" />105 106         <Button107             android:id="@+id/btSum"108             android:layout_gravity="fill"109             android:layout_rowSpan="2"110             android:text="="111             android:textColor="#8b2500" />112 113         <Button114             android:id="@+id/bt0"115             android:layout_columnSpan="2"116             android:layout_gravity="fill"117             android:text="0"118             android:textColor="#8b2500" />119 120         <Button121             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             @Override106             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             @Override126             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             @Override142             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     @Override155     public boolean onCreateOptionsMenu(Menu menu) {156         getMenuInflater().inflate(R.menu.main, menu);157         return true;158     }159 160     @Override161     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         @Override172         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                 } else214                     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         @Override228         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 == 2233                         || calculFlg == 3)234                     numFlg = 1;235                 else236                     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)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。

 

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