1、安卓应用程序设计简易计算器的实现院 ( 系 ) 名 称专 业 名 称学 生 姓 名学 生 学 号课 程 名 称2016 年 6 月 日 1.系统需求分析Android 是以 Linux 为核心的手机操作平台,作为一款开放式的操作系统,随着Android 的快速发展,如今已允许开发者使用多种编程语言来开发 Android 应用程序,而不再是以前只能使用 Java 开发 Android 应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。计算器通过算法实行简单的数学计算从而提高了数学计算的效率,实现计算器的界面优化,使界面更加友好,操作更加方便。基于 android 的计
2、算器的设计, 系统具有良好的界面;必要的交互信息;简约美观的效果。使用人员能快捷简单地进行操作,即可单机按钮进行操作,即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间。2.系统概要设计2.1 计算器功能概要设计根据需求,符合用户的实际要求,系统应实现以下功能:计算器界面友好,方便使用,具有基本的加、减、乘、除功能,能够判断用户输入运算数是否正确,支持小数运算,具有清除功能。图 2.1 系统功能图整个程序基于 Android 技术开发,除总体模块外主要分为输入模块、显示模块以及计算模块这三大部分。在整个系统中总体模块控制系统的生命周期,输入模块部分负责读取用户输入的数据,显示
3、模块部分负责显示用户之前输入的数据以及显示最终的计算结果,计算模块部分负责进行数据的运算以及一些其他的功能。具体的说,总体模块的作用主要是生成应用程序的主类,控制应用程序的生命周期。输入模块主要描述了计算器键盘以及键盘的监听即主要负责读取用户的键盘输入以及响应触屏的按键,需要监听手机动作以及用指针事件处理方法处理触屏的单击动作。同时提供了较为直观的键盘图形用户界面。 显示模块描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计算结果,同时负责显示一些其他的信息。 计算模块则主要描述了计算器的整体,实现了计算器的界面,负责计算用户输入数据,包括加、减、乘、除等各种功能,记忆数据的相关
4、功能,清零的功能。图 2.2 三大模块2.2 输入模块设计系统如果想完成计算器中各种功能,首先用户要能进行数据输入,由于是在触屏手机上开发计算器程序,所以要求输入可以直接使用触屏进行,所以在设计的时候就要充分的考虑这一点。正是由于考虑到这个特殊的地方,所以在进行模块设计中,选择编写输入模块类的时候会特意选取使用可以支持触屏输入的特殊增强型图形用户界面类。 输入模块主要的任务是描述计算器键盘以及实现键盘的监听,即当用户点击按键或者屏幕的时候监听会去调用相应的处理办法,本模块还需要为系统提供一个较为直观的键盘图形用户界面。输入模块的功能图如图图 2.3 输入模块2.3 显示模块设计作为手机计算器系
5、统,显示部分也是必不可少的一部分。没有显示部分就没有办法显示用户输入的数字是否正确,甚至不能显示计算出的结果,由此可见显示模块即包括输入的部分(因个人技术原因不能显示表达式的形式)也包括输出的部分。 显示模块主要完成的任务是描述计算器的显示区,该区域用于显示用户输入的数据以及最终的计算结果和一些其他信息。同时本模块还将提供调用和设置显示的具体方法总体系统显示模块计算模块输入模块输入模块设置按钮按键监听设置监听调用 设置按键监听显示数据 设置显示图 2.4 显示模块2.4 计算模块设计系统要完成整个的计算器的功能,那么计算模块就是整个系统的重要模块。没有计算模块系统就不能顺利的完成计算,就无法达
6、到用户的要求。所以计算模块的设计也是本次系统设计的重点。 系统想要能在屏幕上显示出计算器的样子要有整体的布局。在本模块中要完成布局的具体设计,使用户能够看到整个计算器的界面。同时系统想完成 计算功能必须要处理用户的输入,当输入模块的监听传到计算模块中时,计算模块就要根据相应的方法进行进一步的处理。图 2.5 计算模块显示模块显示区设置计算模块整体布局 逻辑判断运算输入判断 数值输入判断普通运算功能记忆相关功能 清零功能3.设计与实现部分3.1 应用程序构成Android 应用程序一般是由Activity、Serviece、Content Provider、Intent、Intent Recei
7、ver、Notification 六个组件构成。但并非每一个 Android 应用程序都包含这六个组件。 (1 ) Activity(活动):应用程序的表示层。Activity 是 Android 的基本组件。每一个activity 代表一个单独的屏幕。每一个 activity 都是继承于 Activity 的独立类。这个 activity类将会显示出几个 Views 控件组成的用户接口,并对事件作出响应。Android 使用了Intent,实现在屏幕与屏幕之间跳转。Activity 跳转时只需要调用startActivity(Intent myIntent)方法。然后,系统会在所有安装的应用
8、程序中定义的IntentFilter 中查找,找到最匹配 myIntent 的 Intent 对应的 activity。新的 activity 接收到myIntent 的通知后,开始启动运行。当 startActivity 方法被调用将触发解析 myIntent 的动作,这个机制提供了两个关键的好处:能够重复利用从其他组件中以 Intent 的形式产生的一个请求和可以在任何时候被一个具有相同 IntentFilter 的新的 startActivity 取代。(2 ) Service(服务) :Android 应用程序的后台运行组件。Service 没有用户界面的程序。服务组件在后台运行,它们
9、可以更新数据源和可见的 Activity,并触发 Notification。它们被用来执行一些需要在后台持续的常规处理。例如媒体播放器这个 activity 会使用Context. startService()方法,连接到一个 service 上(如果这个 service 还没有运行将启动它) 。当连接到一个 service 之后,我们还可以通过 service 提供的接口与它进行通讯。(3 ) Content Provider(内容提供器):用来管理和分享应用程序数据库。Content Provider 是在应用程序之间共享数据的首选方法。通过配置 Content Provider 允许其他
10、应用程序访问存储的数据,也可以使用其他应用程序提供的 Content Provider 来访问它们存储的数据。Android 平台也提供了系统自带的 Content Provider,如联系人信息等。(4 ) Intent(意向):Activity 之间的粘合剂。使用 Intent,可以在系统范围内向目标活动或者服务广播消息,说明希望执行某个动作的意图。之后系统就会确定那些最适合执行动作的目标。(5 ) Notification(通知):一种用户通知框架。通过允许向用户发送信号,而不会过分吸引他们的注意力或者打断他们当前的活动。它们是服务或者广播接收器吸引用户注意的首选方法。例如,当设备接收到
11、一个文本消息或者来电的时候,它可以通过闪灯、发出声音、显示图标或则会显示对话框信息的方式提示用户。(6 ) Intent Receiver(意向接收器):通过 Intent Receiver 实现应用能够对一个外部的事件作出响应,Intent Receiver 在 AndroidManifest.xml 中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个 intent receive 被触发时,应用不必对请求调用intent receive,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它
12、们自己的 intent receive 广播给其他应用程序。3.2 功能的具体实现(1 )计算器布局设计:分别实用 Button 按钮操作 17 个按钮,分别是+ 、*、/、=、0-9、清除按钮,以及EditTest 的文本域,并通过代码布局调整布局,使布局更加清晰,简洁。布局方式如图所示:代码实现如下:(2 )计算功能实现加法实现:从 editTest 中获取数字赋值于 num1,等待数字 num2 的输入。代码如下:case R.id.button13:String mystringadd = edit.getText().toString(); if(mystringadd.equals
13、(null) return; num1 = Double.valueOf(mystringadd); edit.setText(null); op = 1; isClickEqu = false; break; 减法实现、乘法实现、除法实现和加法实现大体相同,但是 op 的赋值不同分别是 2、3、4。然后进行等号的计算实现,在同时记录下文本中的 num2 的数值,然后设置 switch 方法,case 中 op 的值分别为 1、2 、3、4 代表的分别加、减、乘、除。然后根据 case 选项进行相应的加、减、乘、除运算,代码实现如下所示:case R.id.button12: /等号,算法实现
14、String myStringeq=edit.getText().toString(); if (myStringeq.equals(null) return; num2 = Double.valueOf(myStringeq); edit.setText(null); switch (op) case 0: Result = num2; break; case 1: Result = num1 + num2; break; case 2: Result = num1 - num2; break; case 3: Result = num1 * num2; break; case 4: Res
15、ult = num1 / num2; break; edit.setText(String.valueOf(Result); isClickEqu = true; break; 4.运行界面截图运行结果界面:除法:20 除以 4 的结果乘法 3.89 乘以 1.2 的结果减法 3.6 减去 0.6除数为零:点击清除之后的效果5.核心代码import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.view.View.OnC
16、lickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener Button button1,button2,button3,button4,button5,button6,button7,button8;Button button9,button10,button11,button12,button13,button1
17、4,button15,button16,button17;EditText edit=null;double num1 = 0, num2 = 0 ,Result =0;boolean isClickEqu = false;int op = 0; Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1=(Button)this.findViewById(R.id.butt
18、on1);button2=(Button)this. findViewById(R.id.button2);button3=(Button)this. findViewById(R.id.button3);button4=(Button)this. findViewById(R.id.button4);button5=(Button)this. findViewById(R.id.button5);button6=(Button)this. findViewById(R.id.button6);button7=(Button)this. findViewById(R.id.button7);b
19、utton8=(Button)this. findViewById(R.id.button8);button9=(Button)this. findViewById(R.id.button9);button10=(Button)this. findViewById(R.id.button10);button11=(Button)this. findViewById(R.id.button11);button12=(Button)this. findViewById(R.id.button12);button13=(Button)this. findViewById(R.id.button13)
20、;button14=(Button)this. findViewById(R.id.button14);button15=(Button)this. findViewById(R.id.button15);button16=(Button)this. findViewById(R.id.button16);button17=(Button)this. findViewById(R.id.button17);edit=(EditText) findViewById(R.id.editText1);button1.setOnClickListener(this);button2.setOnClic
21、kListener(this);button3.setOnClickListener(this);button4.setOnClickListener(this);button5.setOnClickListener(this);button6.setOnClickListener(this);button7.setOnClickListener(this);button8.setOnClickListener(this);button9.setOnClickListener(this);button10.setOnClickListener(this);button11.setOnClick
22、Listener(this);button12.setOnClickListener(this);button13.setOnClickListener(this);button14.setOnClickListener(this);button15.setOnClickListener(this);button16.setOnClickListener(this);button17.setOnClickListener(this);Overridepublic boolean onCreateOptionsMenu(Menu menu) / Inflate the menu; this ad
23、ds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;Overridepublic void onClick(View v) / TODO Auto-generated method stubswitch(v.getId()case R.id.button17: edit.setText(null); Toast.makeText(MainActivity.this, “已经清除“, Toast.LENGTH_LONG).show(); break
24、;case R.id.button1:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString1=edit.getText().toString(); myString1+=“1“; edit.setText(myString1); break; case R.id.button2:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString2=edit.getText().toString(); myString2+=“2“; edit.
25、setText(myString2); break;case R.id.button3:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString3=edit.getText().toString(); myString3+=“3“; edit.setText(myString3); break;case R.id.button4:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString4=edit.getText().toString(
26、); myString4+=“4“; edit.setText(myString4); break;case R.id.button5:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString5=edit.getText().toString(); myString5+=“5“; edit.setText(myString5); break;case R.id.button6:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString6=
27、edit.getText().toString(); myString6+=“6“; edit.setText(myString6); break;case R.id.button7:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString7=edit.getText().toString(); myString7+=“7“; edit.setText(myString7); break;case R.id.button8:if(isClickEqu) edit.setText(null); isClickEqu=
28、false; String myString8=edit.getText().toString(); myString8+=“8“; edit.setText(myString8); break;case R.id.button9:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString9=edit.getText().toString(); myString9+=“9“; edit.setText(myString9); break;case R.id.button10:if(isClickEqu) edit.s
29、etText(null); isClickEqu=false; String myString10=edit.getText().toString(); myString10+=“0“; edit.setText(myString10); break;/点case R.id.button11:if(isClickEqu) edit.setText(null); isClickEqu=false; String myString11=edit.getText().toString(); myString11+=“.“; edit.setText(myString11); break;/加case
30、 R.id.button13:String mystringadd = edit.getText().toString(); if(mystringadd.equals(null) return; num1 = Double.valueOf(mystringadd); edit.setText(null); op = 1; isClickEqu = false; break; /减 case R.id.button14: String mystringred = edit.getText().toString(); if(mystringred.equals(null) return; num
31、1 = Double.valueOf(mystringred); edit.setText(null); op = 2; isClickEqu = false; break; case R.id.button15: String mystringmul = edit.getText().toString(); if(mystringmul.equals(null) return; num1 = Double.valueOf(mystringmul); edit.setText(null); op = 3; isClickEqu = false; break; case R.id.button1
32、6: String mystringat = edit.getText().toString(); if(mystringat.equals(null) return; num1 = Double.valueOf(mystringat); edit.setText(null); op = 4; isClickEqu = false; break; case R.id.button12: String myStringeq=edit.getText().toString(); if (myStringeq.equals(null) return; num2 = Double.valueOf(my
33、Stringeq); edit.setText(null); switch (op) case 0: Result = num2; break; case 1: Result = num1 + num2; break; case 2: Result = num1 - num2; break; case 3: Result = num1 * num2; break; case 4: if(num2=0)Toast.makeText(MainActivity.this, “0 不能为除数“, Toast.LENGTH_LONG).show(); Result = num1 / num2; break; edit.setText(String.valueOf(Result); isClickEqu = true; break;