我的第一个Android程序-计算器

基于Android 2.3.3做的一个练手计算器。 
可解析带括号的四则运算。 
解析算术表达式的时候,准备调用Webkit通过Js来解析的。 
但是2.3.3存在Bug,Js调用Java会导致程序崩溃, 
所以没办法,最后是用 BeanShell来解析的。 
不过,因为需要每个参与计算的数字都是浮点型, 
才能正确无误的保留精度,因为我正则不行,过滤表达式还是花了点功夫 
首个Android程序,欢迎大家给与意见和指导~ 

标签:
Android SDK

代码片段(4)

[图片] calc.png

[文件] calculator.apk ~ 360KB    下载(137)

[文件] calc-src.zip ~ 2MB    下载(1451)

[代码] [Java]代码

001 package com.example.calculator;
002  
003  
004 import java.util.Arrays;
005  
006 import bsh.EvalError;
007 import bsh.Interpreter;
008 import android.os.Bundle;
009 import android.app.Activity;
010 import android.view.View;
011 import android.view.View.OnClickListener;
012 import android.widget.Button;
013 import android.widget.EditText;
014  
015 /**
016  *
@author 铂金小龟
017  */
018 public class CalculatorActivity extends Activity implements OnClickListener{
019  
020     EditText
rsText = 
null;  //显示器
021     boolean isClear
false//用于是否显示器需要被清理
022     @Override
023     protected void onCreate(Bundle
savedInstanceState) {
024         super.onCreate(savedInstanceState);
025         setContentView(R.layout.calculator);
026          
027         //fun
功能按钮
028         rsText
= (EditText)findViewById(R.id.rsText);
029         Button
btnDel = (Button)findViewById(R.id.delete);
030         Button
btnPlu = (Button)findViewById(R.id.plus);
031         Button
btnMin = (Button)findViewById(R.id.minus);
032         Button
btnMul = (Button)findViewById(R.id.multiply);
033         Button
btnDiv = (Button)findViewById(R.id.division);
034         Button
btnEqu = (Button)findViewById(R.id.equ);
035         Button
btnTono = (Button)findViewById(R.id.tonone);
036         Button
btnLeft = (Button)findViewById(R.id.left);
037         Button
btnRight = (Button)findViewById(R.id.right);
038          
039         //num
数字按钮
040         Button
num0 = (Button)findViewById(R.id.num0);
041         Button
num1 = (Button)findViewById(R.id.num1);
042         Button
num2 = (Button)findViewById(R.id.num2);
043         Button
num3 = (Button)findViewById(R.id.num3);
044         Button
num4 = (Button)findViewById(R.id.num4);
045         Button
num5 = (Button)findViewById(R.id.num5);
046         Button
num6 = (Button)findViewById(R.id.num6);
047         Button
num7 = (Button)findViewById(R.id.num7);
048         Button
num8 = (Button)findViewById(R.id.num8);
049         Button
num9 = (Button)findViewById(R.id.num9);
050         Button
dot = (Button)findViewById(R.id.dot);
051          
052         //listener
053         btnTono.setOnClickListener(this);
054         btnLeft.setOnClickListener(this);
055         btnRight.setOnClickListener(this);
056         btnDel.setOnClickListener(this);
057         btnPlu.setOnClickListener(this);
058         btnMin.setOnClickListener(this);
059         btnMul.setOnClickListener(this);
060         btnDiv.setOnClickListener(this);
061         btnEqu.setOnClickListener(this);
062           num0.setOnClickListener(this);
063           num1.setOnClickListener(this);
064           num2.setOnClickListener(this);
065           num3.setOnClickListener(this);
066           num4.setOnClickListener(this);
067           num5.setOnClickListener(this);
068           num6.setOnClickListener(this);
069           num7.setOnClickListener(this);
070           num8.setOnClickListener(this);
071           num9.setOnClickListener(this);
072           dot.setOnClickListener(this);
073     }
074  
075     @Override
076     public void onClick(View
e) {
077         Button
btn = (Button)e;
078         String
exp = rsText.getText().toString();
079         if(isClear
&&(
080               btn.getText().equals("0")
081             ||btn.getText().equals("1")
082             ||btn.getText().equals("2")
083             ||btn.getText().equals("3")
084             ||btn.getText().equals("4")
085             ||btn.getText().equals("5")
086             ||btn.getText().equals("6")
087             ||btn.getText().equals("7")
088             ||btn.getText().equals("8")
089             ||btn.getText().equals("9")
090             ||btn.getText().equals("."))
091         ||btn.getText().equals("算数公式错误")){
092             rsText.setText("");
093             isClear
false;
094         }
095         if(btn.getText().equals("C")){
096             rsText.setText("");
097         }else if(btn.getText().equals("清除")){
098             if(isEmpty(exp)) return;
099             else
100                 rsText.setText(exp.substring(0,
exp.length()-
1));
101         }else if(btn.getText().equals("=")){
102             if(isEmpty(exp)) return;
103             exp
= exp.replaceAll(
"×""*");
104             exp
= exp.replaceAll(
"÷""/");
105             rsText.setText(getRs(exp));
106             isClear
false;
107         }else{
108             rsText.setText(rsText.getText()+""+btn.getText());
109             isClear
false;
110         }
111         //操作完成后始终保持光标在最后一位
112         rsText.setSelection(rsText.getText().length());
113     }
114  
115     /***
116      *
@param  exp 算数表达式
117      *
@return 根据表达式返回结果
118      */
119     private String
getRs(String exp){
120             Interpreter
bsh = 
new Interpreter();
121             Number
result = 
null;
122             try {
123                 exp
= filterExp(exp);
124                 result
= (Number)bsh.eval(exp);
125             catch (EvalError
e) {
126                 e.printStackTrace();
127                 isClear
true;
128                 return "算数公式错误";
129             }       
130             exp
= result.doubleValue()+
"";
131             if(exp.endsWith(".0"))
132                 exp
= exp.substring(
0,
exp.indexOf(
".0"));
133             return exp;
134     }
135  
136          
137     /**
138      *
因为计算过程中,全程需要有小数参与,所以需要过滤一下
139      *
@param exp 算数表达式
140      *
@return
141      */
142     private String
filterExp(String exp) {
143         String
num[] = exp.split(
"");
144         String
temp = 
null;
145         int begin=0,end=0;
146          for (int i
1;
i < num.length; i++) {
147              temp
= num[i];
148              if(temp.matches("[+-/()*]")){
149                  if(temp.equals(".")) continue;
150                  end
= i - 
1
151                  temp
= exp.substring(begin, end);
152                  if(temp.trim().length()
0 &&
temp.indexOf(
".")<0)
153                      num[i-1]
= num[i-
1]+".0";
154                  begin
= end + 
1;
155              }
156          }
157          return Arrays.toString(num).replaceAll("[\\[\\],
]"
"");
158     }
159      
160     /***
161      *
@param str
162      *
@return 字符串非空验证
163      */
164     private boolean isEmpty(String
str){
165         return (str==null ||
str.trim().length()==
0);
166     }
167      
168 }
时间: 2024-10-29 06:57:45

我的第一个Android程序-计算器的相关文章

手机文件控制-pc和手机通过usb连接时,怎么设计一个android程序让电脑读出指定的文件夹。

问题描述 pc和手机通过usb连接时,怎么设计一个android程序让电脑读出指定的文件夹. pc和手机通过usb连接时,怎么设计一个android程序让电脑读出指定的文件夹 解决方案 类似各种手机助手 android上跑一个server,电脑上跑client,之间通过adb等通信 解决方案二: 通过USB也可以模拟成网络,通过Socket完成服务器与客户端的通讯.这种方式需要在设置里设置一下,网络中. 解决方案三: 这个需要在手机上安装个App吧

安卓应用开发-一个android程序的疑问?

问题描述 一个android程序的疑问? 初学安卓开发,有一个关于animation的问题.我是想试一个实现侧滑动的效果,用了一个铺满屏幕的Framelayout F里面放了两个不同背景色的view.view A是铺满整个屏幕,view B是20宽度,然后在activity的onCreat里设置B的LayoutParam的leftMargin=-20让它从左边超出屏幕.之后对Framelayout对象创建了一个移动动画对象,让其右移动50距离,我以为这样就可以将B和A一起移动了,可是运行后发现只

database-如何创建一个 android 程序升级机制?

问题描述 如何创建一个 android 程序升级机制? 我开发了一个android 程序,然后在平板电脑上安装了 apk. 现在我想修改一些代码行和SQLite 数据库中的一个表格,但是我不想重新安装 apk,我想升级一下. 那么如何创建这个升级机制? 解决方案 在你继承的SQLiteOpenHelper中重写SQLiteOpenHelper public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion), 你只需

《精通Android 实例开发》——第1章,第1.14节第一个Android程序

1.14 第一个Android程序 1.14.1 实例说明经过本书前面实例的讲解,想必读者已经了解了搭建Android开发环境的基本知识.在本实例中,将通过一个简单Android实例的实现过程来说明编写Android应用代码的具体流程. 我们知道Eclipse是开发Android应用项目的最佳集成开发环境,所以本书中的具体编码实例都将使用Eclipse来实现.使用Eclipse开发传统Android应用项目的方法和开发传统Java项目的方法基本相似,都要事先创建Project工程项目,然后才能编

《Android 应用案例开发大全(第二版)》——1.5节第一个Android程序——Hello Android

1.5 第一个Android程序--Hello AndroidAndroid 应用案例开发大全(第二版)在学习Java时,写的第一个程序都是Hello World.本节讲述如何在Android中开发自己的第一个Android程序--Hello Android. 首先打开Eclipse,依次单击File菜单/New/Other来创建一个新的Android项目,如图1-22所示. 然后选择Android目录下的Android Project,最后单击Next按钮,如图1-23所示. 随后为创建Hel

安卓开发-研究一个android程序,如何跟一个网页层进行数据传递,

问题描述 研究一个android程序,如何跟一个网页层进行数据传递, 目前我们的程序是直接打开一个网页. 很多android程序都是界面内包含网页的,但是却有一些标题栏一样的东西,可以控制网页,设置登陆登出等.登出之后,网页的个人信息也随之消失. 我想问一下普遍都是什么方式交互. 解决方案 用jason什么的目前比较普遍吧.javascript也能支持. 解决方案二: 用jason什么的目前比较普遍吧.javascript也能支持.

《Android游戏编程入门经典》——第4章创建第一个Android程序

第4章 创建第一个Android程序Android游戏编程入门经典本章介绍如下内容: 创建新Android项目:配置NetBeans的NBAndroid插件:在模拟器中编译并运行程序: 编写Hello, Android!程序: 对比模拟器和Android设备. 在本章中,您将编写第一个Android程序.前面几章已经帮助您使用Android SDK构建了NetBeans和Eclipse开发环境.您还应该已经使用Android Virtual Device Manager创建了一台Android模

第一行代码阅读笔记---详解分析第一个Android程序

以下是我根据作者的思路,创建的第一个Android应用程序,由于工具强大,代码都自动生成了,如下: package com.example.first_app; import android.os.Bundle; import android.app.Activity; import android.view.Menu; //MainActivity继承于Activity类 此处用到了java关键字extends public class MainActivity extends Activit

推荐几本Android程序员必读书籍_Android

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发,从语言上来看,Android应用开发基于的是Java语言,但是这都是我们要自己下功夫去学习的事情. 不管你是Android菜鸟还是Android大神,一定能够找到一本适合自己阅读的书籍,抓紧来看看吧! 高尔基曾说"书是人类进步的阶梯",今天小编就为大家整理了一些优秀Android程序员都会阅读的书籍,帮助大家成为一个优秀的程序员 第1本书