zoukankan      html  css  js  c++  java
  • 菜鸟学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         <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)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。

  • 相关阅读:
    saltstack源码详解一
    linux的yum报错
    django restframework
    列表生成式
    面向对象的封装
    linux对于zombie的处理
    Flask学习目录
    #1_两数之和
    LeetCode入门
    Struts2(一)——基本使用
  • 原文地址:https://www.cnblogs.com/beiyan/p/4217490.html
Copyright © 2011-2022 走看看