let's continue 。。。

 

计算器我想大家都不陌生,就不在此赘述了。

首先说说它的界面组成。

 

计算器图片

界面中主要用到的就是线性布局以及一个TextView和4组Button,下图可以清晰地看清楚整个布局:

 

计算器布局

呵呵,界面还算简单,接下来就说说事件的添加吧。

完整的代码如下:

 

  1. package zjuedward.excercise; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.View; 
  6. import android.widget.Button; 
  7. import android.widget.TextView; 
  8. import android.view.View.OnClickListener; 
  9.  
  10. public class SimpleCalcActivity extends Activity { 
  11.     /** Called when the activity is first created. */ 
  12.      
  13.     TextView tv; 
  14.     int [] buttons;         // 数字按钮数组 
  15.     double result; 
  16.     double result0; 
  17.     double result1; 
  18.      
  19.     // 按钮对象声明 
  20.     Button buttonC; 
  21.     Button buttonJia; 
  22.     Button buttonJian; 
  23.     Button buttonCheng; 
  24.     Button buttonChu; 
  25.     Button buttonDengyu; 
  26.      
  27.     String str1;            // 旧输入的值 
  28.     String str2;            // 新输入的值 
  29.     int flag = 0;           // 计算标志位,0:第一次输入,1:加,2:减,3:乘,4:除,5:等于 
  30.     int preOp = 0;          // 前一次操作的值,1:数字,2:运算符,3:等号 
  31.     Button temp; 
  32.      
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) { 
  35.         super.onCreate(savedInstanceState); 
  36.         setContentView(R.layout.main); 
  37.          
  38.         initButton(); 
  39.          
  40.         // 清空按钮监听事件 
  41.         buttonC.setOnClickListener( 
  42.             new OnClickListener() { 
  43.                 public void onClick(View v) { 
  44.                     str1 = ""
  45.                     str2 = ""
  46.                     tv.setText(str1); 
  47.                     flag = 0
  48.                 } 
  49.             } 
  50.         ); 
  51.          
  52.         // 数字按钮监听事件 
  53.         for (int i = 0; i < buttons.length; i ++) { 
  54.             temp = (Button) findViewById(buttons[i]); 
  55.             temp.setOnClickListener(new OnClickListener() { 
  56.                 public void onClick(View v) { 
  57.                     str1 = tv.getText().toString().trim(); 
  58.                     if (flag == 0) { 
  59.                         str1 = str1 + String.valueOf(((Button) v).getText()); 
  60.                         tv.setText(str1); 
  61.                     } 
  62.                     else { 
  63.                         str2 += ((Button) v).getText().toString().trim(); 
  64.                         str1 = tv.getText().toString().trim(); 
  65.                         tv.setText(str2); 
  66.                     } 
  67.                 } 
  68.             }); 
  69.         } 
  70.          
  71.         // 运算符按钮监听事件 
  72.         buttonListener(buttonJia, 1); 
  73.         buttonListener(buttonJian, 2); 
  74.         buttonListener(buttonCheng, 3); 
  75.         buttonListener(buttonChu, 4); 
  76.          
  77.         // 等于按钮监听事件 
  78.         buttonDengyu.setOnClickListener(new OnClickListener() { 
  79.             public void onClick(View v) { 
  80.                 result1 = Double.parseDouble(str2); 
  81.                 if (flag == 1
  82.                     result = result0 + result1; 
  83.                 else if (flag == 2
  84.                     result = result0 - result1; 
  85.                 else if (flag == 3
  86.                     result = result0 * result1; 
  87.                 else if (flag == 4
  88.                     result = result0 * 1.0 / result1; 
  89.                 flag = 0
  90.                 String str = (result + "").trim(); 
  91.                 tv.setText(str); 
  92.                 str2 = ""
  93.             } 
  94.         }); 
  95.          
  96.          
  97.          
  98.     } 
  99.      
  100.     // To-do 当不按照运算顺序点击按钮时,如多按几下=号,就会出错 
  101.      
  102.      
  103.     public void initButton() { 
  104.         tv = (TextView) findViewById(R.id.tv); 
  105.         str1 = String.valueOf(tv.getText()); 
  106.         str2 = ""
  107.          
  108.         buttonC = (Button) findViewById(R.id.ButtonC); 
  109.         buttonJia = (Button) findViewById(R.id.ButtonJia); 
  110.         buttonJian = (Button) findViewById(R.id.ButtonJian); 
  111.         buttonCheng = (Button) findViewById(R.id.ButtonCheng); 
  112.         buttonChu = (Button) findViewById(R.id.ButtonChu); 
  113.         buttonDengyu = (Button) findViewById(R.id.ButtonDengyu); 
  114.          
  115.         buttons = new int[] { 
  116.                 R.id.Button00,R.id.Button01,R.id.Button02,R.id.Button03,R.id.Button04, 
  117.                 R.id.Button05,R.id.Button06,R.id.Button07,R.id.Button08,R.id.Button09 
  118.         }; 
  119.          
  120.          
  121.     } 
  122.      
  123.     public void buttonListener(Button button, final int id) { 
  124.         button.setOnClickListener(new OnClickListener() { 
  125.             public void onClick(View v) { 
  126.                 String str = tv.getText().toString().trim(); 
  127.                 result0 = Double.parseDouble(str); 
  128.                 // To-do (不应该清空,否则多次按运算符按钮会出错) 
  129.                  
  130.                 flag = id; 
  131.             } 
  132.         }); 
  133.     } 
  134.      
  135.      
  136.      
  137.      
  138.      

这里的重点就是flag变量的使用,它的作用是当点击不同的Button时,如数字、运算符(+ - * /)、等于,flag就拥有不同的值来表示要进行地不同的运算。

此外旧输入的值str1和新输入的值str2也是一个难点。当单击数字按钮时,若flag=0,即用户没有单击过运算符按钮,则第一个运算数是由多于一个数字组成的。当flag!=0时,必须用str1保存第一个运算数,而str2得到用户单击的按钮值,此处str2一定要用+=号,因为第二个运算数也可能不止1位。并且在用户点击数字按钮后设置TextView的值为str2。

运算符按钮的事件除了设置flag变量外(1:加,2:减,3:乘,4:除),还需要把第一个运算数转换成double型存在result0变量中。

接下来是等于按钮的事件,首先要得到第二个运算数的值,即str2的值,然后根据不同的flag值做不同的四则运算,最后设置flag变量为0,将结果显示在TextView中,并置第二个运算数str2为"",str1不用重置,因为结果的值就是第一个运算数str1的值。

由于数字按钮比较多,所以得到它们的引用有一个小技巧,就是先把它们的id(存在于R.java中)存在一个整型数组中,然后通过循环对每个按钮引用并设置事件。

 

这个计算器还有很多bug,突出的就是不合法的四则运算表达式的输入,如连续按等于号,就是使得程序强行退出。所以还有很多地方需要完善。