Android项目开发实训项目总结报告.doc
.Android项目开发实训报告 姓 名: 赵炳琪 学 号: 140840131 专 业: 软件技术 项目名称: Android手机记账本 指导教师: 陈雪莲 实训日期:2016年10月30日至 2016年12月30日 2016年 12月 25日.Android项目开发实训记录单学号140840131姓名赵炳琪性别男指导教师 陈雪莲项目名称 Android手机记账本项目描述收支管理模块是程序的主体功能,实现了处理用户的收入和支出的信息,进行处理后用表单的形式进行显示,同时提供时间段的收支情况查询功能。 系统除了总体模块以外主要由三大模块来组成,即统计功能和备份功能。项目评语分项成绩平时成绩实践能力实训报告总成绩等级目 录第一章 概述1第二章 需求分析22.1 项目背景22.2 项目需求2第三章 相关技术53.1 Adnroid平台介绍53.2 关键技术研究7第四章 概要设计104.1 系统体系结构104.2 用户界面设计154.2.1计算器界面154.2.2小数点运算界面154.2.3负数运算界面164.2.4开方运算界面16第五章 详细设计175.1数据输入模块175.2数据显示模块175.3 数据计算功能模块17第六章 结论27.第一章 概述随着社会的发展,经济水平的提高,手机越来越普及。同时伴随着已送慧联网技术的发展,手机的功能也变得越来越丰富。从原来只具有简单通信功能的非智能手机到现在具有手机操作系统,除通话功能以外,还集上网、聊天、炒股、收发邮件等功能于一身的智能手机系统。由Google公式牵头众多实力雄厚的软硬件厂商加盟商成立了OMS联盟,病退出的Android平台手机系统,作为时代的新生儿,Android手机操作平台有着得天独厚的优势广阔的发展前景。而计算器作为现在人们日常生活中常用的一种工具也已经可以说是人们日常生活中必不可少的工具了。计算器的发展同样经历了漫长的过程,凝聚无数仙人的智慧,甚至连计算机的发展都可以说是源于计算器的发展。本程序正式基于Android平台开发的计算器。本课题要求:设计一个基于Android的计算器的软件。实现的功能有:具有基本的加、减、乘、除功能,能够判断用户输入运算数是否正确,支持小数运算,具有退格功能,能够删除最后一个输入,具有清除功能,即“C”。因为打开(ON)、关闭(OFF)屏幕按键的功能需重点研究的关键问题:计算器的运算和显示问题。.第二章 需求分析2.1 项目背景随着社会的发展,经济水平的提高,手机越来越普及。同时伴随着移动互联网技术的发展,手机的功能也变得越来越丰富。从原来只具有简单通信功能的非智能手机到现在具有手机操作系统,除通话功能以外,还集上网、聊天、炒股、收发邮件等功能于一身的智能手机系统。 Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。 为了进一步巩固课堂上所学到的知识,深刻把握嵌入式系统以及Java语言的重要概念及其面向对象的特性,使我们能够熟练的应用面向对象的思想和设计方法解决实际问题的能力。 通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。使学生通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。2.2 项目需求根据需求,符合用户的实际要求,系统应实现以下功能:计算器界面友好,方便使 用,显示到少6位结果,具有基本的加、减、乘、除功能,能够判断用户输入运算数是否正确,支持小数运算,具有退格功能,能够删除最后一个输入,具有清除功能,即“C”。因为打开(ON)、关闭(OFF)屏幕按键的功能等。如图2-1所示。整个程序基于Android技术开发,除总体模块外主要分为输入模块、显示模块以及 计算模块这三大部分。在整个系统中总体模块控制系统的生命周期,输入模块部分负责读取用户输入的数据,显示模块部分负责显示用户之前输入的数据以及显示最终的计算结果,计算机模块部分负责进行数据的运算以及一些其他的功能。下面较为详细的做了说明。 具体的说,总体模块的作用主要是生成应用程序的主类,控制应用程序的生命周期。 输入模块主要描述了计算器键盘以及键盘的监听即主要负责读取用户的键盘输入以及响应触屏的按键,需要监听手机动作以及用指针事件处理方法处理触屏的单击动作。同时提供了较为直观的键盘图形用户界面。 显示模块描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计算结果,同时负责显示一些其他的信息。计算模块则主要描述了计算器的整体,实现了计算器的界面,负责计算用户输入数 据,包括加、减、乘、除等各种功能,记忆数据的相关功能,退格以及清零的功能。 系统除了总体模块以外主要由三大模块来组成,即输入模块、显示模块和计算模块, 如图2-2所示:输入模块主要描述了计算器键盘以及键盘的监听即主要负责读取用户的键盘输入以 及响应触屏的按键,需要监听手机按键动作以及用指针事件处理方法处理触屏的单击动作(以松开按键为准)。同时提供了较为直观的键盘图形用户界面。 显示模块描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计 算结果,同时还负责显示一些其他的信息。 计算模块则主要描述了计算器的整体,实现了计算器的界面,负责计算用户输入数 据,包括加、减、乘、除、等各种计算功能,记忆数据的相关功能,退格以及清零的功能。第三章 相关技术3.1 Adnroid平台介绍Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。可以把它简单理解成 Linux上套了一个 JAVA 的壳。 Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金。 Android 的程序可以采用 JAVA 开发, 因为它的虚拟机(Virtual Machine) Dalvik,只是它将 JAVA 的 bytecode 转成自己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。因此,Android 开发环境是需要 JDK 的。 1. 新建项目:打开 Eclipse,选择 File > New > Project > Android Project,具体输入如图3-1所示:在Project name:中输入工程的名字,build target中选择所用的平台,Application name为应用程序的名称,create activity为活动类的名称,配制运行方式:点击Run Configurations会出现图3-2的界面,然后点击androidandroid application新建一个动行方式,在右边project中输入要运行的工程名称。至此运行方式配制完成。运击会行,便会出下如图3-3界面:3.2 关键技术研究每一个应用程序,我们都要设计一个图标,可以说图标是应用程序的名片,好的图标能够很快地吸引用户。在此不对图标问题做过多的介绍。由于不同的android手机有着不同的分辨率,将不同分辨率的图标图片放置在相应位置,如图3-4所示。drawable-hdpi中放置分辨率最高的图标,drawable-mdpi中放置分辨率中等的图标,drawable-ldpi中放置分辨率最低的图标。 图标图片大小的要求如图3-5所示:在AndroidManifest.xml文件中进行修改,修改情况如下:<application android:icon="drawable/jisuanqiqi"android:label="string/app_name"> 其他设置保持不变。 在value中的String.xml中加入app_name,代码为:<string name="app_name">计算器</string>界面设计应该尽量简洁而美观,应该具有良好的交互性。当然,我们每个人可以根据自己的喜好来进行设计,根据我个人的喜好,我最终设计出来的计算器界面如图3-6所示: 从上图中,我们可以很直观的看到,从上到下分别是:显示模块、输入模块、计算模块。 输入模块,主要描述了计算器键盘以及键盘的监听即主要负责读取用户的键盘输入以及响应触屏的按键,当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法,具体的处理办法会在相关的地方进行说明。在本项目中,在触屏上提供了各种功能的按键,分别是C,0,1,2,3,4,5,6,7,8,9,+,-,=,ON, OFF。 在整体界面的设置中,我还为各个按键的设置中我还设置了字体的大小,字体的颜色,分别用下列语句实现: 字体大小:android:textSize="25dip" 字体颜色:android:textColor = "#7f0000" 界面背景:android:background="#888FFF" 显示模块,主要描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计算结果和一些其他信息。显示模块还设置了显示的字体,大小,颜色,同时还设置了显示字体的颜色。具体设置如下代码: <EditText android:id="+id/ed_led" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="left" android:text="" android:textSize="37px" android:layout_marginBottom="20px" android:layout_marginLeft="10px" android:layout_marginRight="10px" android:editable="false" android:cursorVisible="false" android:layout_weight="1" /> 显示区中使用的是基于增强型的图形用户界面EditText,利用此类的功能,在显示模块中完成了以上设置。显示模块声明了这些设置,在用户使用系统的时候,会在协同布局设置一同完成以上设置,使用户在使用的时候可以直观的看到显示区的样子。 一般情况下都会选择差不多的字体,所以此处选择的字体和键盘上显示的字体其实是一样的,但是事实上系统中进行了两次声明,即逻辑上这是两种不同的字体,以及设置字符串text为空。显示区和输入模块中的表格一样,同样分别设置了最小显示以及完美显示这两种状态。然后声明了显示区的画法,画法中包括了显示区的两个矩形组成的显示框,显示框的颜色和大小以及显示框中显示的文字所使用的字体,还有文字在显示框中的位置。最后设置了计算模块中的变量得到以及改变显示中所显示的内容的方法,当显示中的内容发生变化时,系统会运行repaint命令来重画显示区,由于使用的是比较低级的方法,所以只能通过整个显示区来实现显示更新这个命令。这样虽然和使用高级的方法相比速度上可能有点慢,但是由于时间相差的不是很多,在用户的正常使用中是不会有所感觉的。以上就是显示模块的具体实现流程。第四章 概要设计4.1 系统体系结构计算模块则主要描述了计算器的整体,实现了计算器的界面,定义了用户单击的处理办法,通过定义的处理办法来完成用户的操作命令,实现用户的计算要求,这些计算要求包括了数值的输入,小数点的输入,正负号的输入,记忆相关功能的完成,加、减、乘、除等各种计算功能的完成,运算符的替换,初始化系统等等。按键监听同时监听了触屏上的按键和键盘上的按键,其中按键的监听使用了的松开为判断的标准,即用户松开按键的时候程序才会读取数据。计算模块是整个系统的主体部分,整个计算器功能是通过Jisuanq2Activity.java来实现的。 首先,我使用一个数组btn来分别监控十个数字键,用et_led来监控输入内容,用btn_div、btn_mul、btn_sub、btn_plus、btn_equal、btn_dot,分别来表示除法、乘法、减法、加法、等号、点号,具体实现如下代码: private Button btn = new Button10; private EditText et_led; private Button btn_div, btn_mul, btn_sub, btn_plus, btn_equal, btn_dot; 其次,对内容的操作。当有内容输入时,首先接收内容,接受的内容分为两部分:当输入为数据时,则是通过传递给数组str,根据数据的传递判断数据内容的长度,如果没有内容输入则,则通过et_led.setText()为0,如果有数据输入的时候,则通过et_led.setText()显示数据,并且将第一次输入的数据保存predata;当输入为符号时,像“+、-、*、/、C、ON、OFF”时,然后对符号进行判断,具体实现代码如下: private OnClickListener actionPerformed = new OnClickListener() public void onClick(View v) String command = (Button)v).getText().toString(); str=et_led.getText().toString();if(command.compareTo("Bksp") = 0) if(str.length() > 1) et_led.setText(str.substring(0, str.length() - 1);else if(str.length() = 1) et_led.setText("0"); vbegin=true; if(et_led.getText().toString().compareTo("-")=0) et_led.setText("0"); vbegin = true; else if ; 最后,当第二次输入数据的时候,将会数据存到temp,再根据上次输入的符号进行运算,然后将结果保存在temp,如果按键“=”,则会将将结果输出,如果是其他的符号,则会进行相应的运算。程序结构图如下:参照程序的流程图,设计十个Activity。分别为进入页面的Activity,选择运算的Activity,剩下八个分别为输入数据的Activity和显示运算结果的Activity,如图2。在这里应该注意的是每当创建一个新的class,就要继承Activity。需要用到public class jisuanqi extends Activity这句代码因此整理好程序的流程是关键,设计好Activity之间的Intent链接是关键。程序所需的Activity 相应的,需要在res/layout文件夹中建立3个XML文件来对上述的十个Activity进行布局,如图4-4:总体上所需要的Activity和XML布局文件已经建立完毕,下面开始对进入计算器的Activity进行编写,首先在布局文件main.xml中创建两个Button按钮,并且对两个按钮声明ID和布局。两个Button按钮显示为“开始计算”和“退出”如图4-5:然后在jisuanqi.java中,首先要声明Button按钮用到如下代码: private Button button1 private Button button2 在安卓里面,用ID找控件是个非常方便的方法,使用findViewById方法来找到在XML文件中创建的对象。因此在jisuanqi.java中,同样需要使用findViewById方法来找到两个Button控件,代码如下: button1 = (Button)findViewById(R.id.button1); button2 = (Button)findViewById(R.id.button2); 接下来开始编辑第二个Activity,也就是选择运算法则的界面,本界面需要创建4个Button按钮,分别为加、减、乘、除。Id分别为button3、button4、button5、button6。 再下来以加法页面为例,在本页面当中需要创件两个EditText,一个TextView,还有一个Button按钮,TextView显示为“加上”,Button按钮显示为“计算” 三个Activity创建完成后,我们需要实现以下动作:在用户打开软件之后,点击“开始计算”,然后跳转到选择运算法则的界面,当用户点击“加”则程序进入加法界面。由此可见,在整个动作中,需要使用侦听代码来识别用户的操作,然后使用Intent来实现Activity的切换。我们以开始界面跳转到选择运算法则界面为例:首先在“开始计算”按钮上设置侦听代码如下: button1.setOnClickListener(new button1Listener(); 然后开始侦听,当用户点击“开始计算”时,启动Intent来将本界面切换到选择运算法则的界面,在这里需要JAVA中侦听的方法和Intent方法,代码如下:class button1Listener implements OnClickListener Override public void onClick(View v) /生成一个Intent对象 Intent intent = new Intent(); intent.setClass(jisuanqi.this, Activityone.class);jisuanqi.this.startActivity(intent); 在这句代码当中intent.setClass(jisuanqi.this, Activityone.class);是规定了本次跳转是从哪个Activity跳转到Activity,在这里是从jisuanqi.java跳转到Activity.java。 完成了Activity之间的切换,下面我们开始进行运算的编辑,在加法界面,我们编写如下代码来实现将用户输入的两个数传送到Intent中: /生成一个Intent对象 /取得两个值 String FactorOnestr=FactorOne.getText().toString(); String FactorTwostr=FactorTwo.getText().toString(); /取得两个值放在Intent中 Intent intent = new Intent(); intent.putExtra("one",jiashuoneStr);intent.putExtra("two",jiashutwoStr);/使用这个Intent来激活答案页 intent.setClass(plus.this, resultplus.class);plus.this.startActivity(intent); 接下来要进行的是显示答案的Activity的编写,在这里我们要注意的是Intent传过来的是两个字符串,字符串是不能相加的,因此我们要将两个字符串强制转换为整形,然后才可以相加,代码如下: plusresult = (TextView)findViewById(R.id.plusresult); /得到Intent对象当中的值 Intent intent = getIntent(); String FactorOnestr=FactorOne.getText().toString(); String FactorTwostr=FactorTwo.getText().toString(); /将字符串转为整形 Log.i("FactorOnestr",FactorOnestr);Log.i("FactorTwostr",FactorTwostr); /计算两数之和 int result = jiashuone + jiashutwo; plusresult.setText(result + ""); 减法,乘法,除法的界面类似于加法的界面,这里不再过多介绍了。 最后需要注意的是要在AndroidMainfest.xml文件中将所有的Activity进行注册,然后才可以运行。4.2 用户界面设计4.2.1计算器界面 图4.2.14.2.2小数点运算界面图4.2.24.2.3负数运算界面图4.2.34.2.4开方运算界面图4第5章 详细设计5.1数据输入模块系统如果想完成计算器中的各种功能,首先用户要能进行数据输入,由于是在触屏手机上开发计算器程序,所以要求输入可以直接使用触屏进行,所以在设计的时候就要充分的考虑要这一点。正是由于考虑到这个特殊的地方,所以在进行模块设计中,选择编写输入模块类的时候会特意选取使用了可以支持触屏输入的特殊增强型图形用户界面类。输入模块主要的任务是描述计算器键盘以及实现键盘的监听,即当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法,本模块还需要为系统提供了一个较为直观的键盘图形用户界面。5.2数据显示模块作为手机计算器系统,显示部分也是必不可少的一部分。没有显示部分就没有办法显示用户输入的数字是否正确,甚至不能显示计算出的结果,由此可见显示模块即包括输入的部分也包括输出的部分。显示模块主要要完成的任务是描述计算器的显示区,该区域用于显示用户输入的数据以及最终的计算结果和一些其他信息。同时本模块还将提供调用和设置显示的具体方法。5.3 数据计算功能模块系统要完成整个的计算器的计算功能,那么计算模块就是整个系统的重点模块。没有计算模块系统就不能顺利的完成计算,就无法达到用户的要求。所以计算模块的设计也是本次系统设计中的重点。系统想要能在屏幕上显示出计算器的样子要有整体的布局,在本模块中要完成布局的具体设计,使用户能够看到整个计算器的画面。同时系统想完成计算功能必须要处理用户的输入,当输入模块的监听传到计算模块中时,计算模块就要根据相应的方法进行进一步的处理。这部分主要是对输入进行的逻辑判断,基本会通if else来实现逻辑判断。package com.android.calculator; import java.math.BigDecimal; import java.math.RoundingMode; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.Selection; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; class Flag private int a0; private int a1; private int a2; private int a3; public int a0() return a0; public int a1() return a1; public int a2() return a2; public int a3() return a3; public Flag(int a,int b,int c,int d) a0=a; a1=b; a2=c; a3=d; public Flag next; class FlagList private Flag first;public FlagList(int a,int b,int c,int d) first=null; public boolean isEmpty() return (first=null); public void insertFirst(int a,int b,int c,int d) Flag newFlag = new Flag(a,b,c,d); newFlag.next = first; first = newFlag; public Flag deleteFirst() Flag temp = first; first = first.next; return temp; class FlagStack private FlagList theFlagList; private int count; public FlagStack() theFlagList = new FlagList(0,0,0,0); count=0; public void push(int a,int b,int c,int d) theFlagList.insertFirst(a,b,c,d); count+; public Flag pop() count=count-1; return theFlagList.deleteFirst(); public boolean isEmpty() return ( theFlagList.isEmpty() ); public int count() return count; class Num private String s=new String(); public Num(String s1) s=s1; public String getNum() return s; public Num next; class NumList private Num firstNum; public NumList() firstNum=null; public boolean isEmpty() return (firstNum=null); public void insertFirst(String s1) Num newNum = new Num(s1); newNum.next = firstNum; firstNum = newNum; public Num deleteFirst() Num temp = firstNum; firstNum = firstNum.next; return temp; class NumStack private NumList theNumList; private int countNum; public NumStack() theNumList = new NumList(); countNum=0; public void push(String s1) theNumList.insertFirst(s1); countNum+; public Num pop() countNum=countNum-1; return theNumList.deleteFirst(); public boolean isEmpty() return ( theNumList.isEmpty() ); public int countNum() return countNum; class Symbol private char c; private int degree1; public Symbol(char c1) c=c1; if(c=|c=) degree1=2; else degree1=1; public int getDegree() return degree1; public char getSymbol() return c; public Symbol next; class SymbolList private Symbol firstSymbol; public SymbolList() firstSymbol=null; public boolean isEmpty() return (firstSymbol=null); public void insertFirst(char c1) Symbol newSymbol = new Symbol(c1); newSymbol.next = firstSymbol; firstSymbol = newSymbol; public Symbol deleteFirst() Symbol temp = firstSymbol; firstSymbol = firstSymbol.next; return temp; class SymbolStack private SymbolList theSymbolList; private int countSymbol; public SymbolStack() theSymbolList = new SymbolList(); countSymbol=0; public void push(char c1) theSymbolList.insertFirst(c1); countSymbol+; public Symbol pop() countSymbol=countSymbol-1; return theSymbolList.deleteFirst(); public boolean isEmpty() return ( theSymbolList.isEmpty() ); public int countSymbol() return countSymbol; public class CalculatorActivity extends Activity /* Called when the activity is first created. */ if(Character.isDigit(mass j)|mass j=46) n=n+massj; else if(n.length()!=0) numStack.push(n); n=new String(""); symbolStack.push(massj); if(j=mass.length-1&&n.length()!=0) numStack.push(n); n=new String(""); /在这使用了栈,需要使用这两个循环改变计算 顺序 while(numStack.countNum()>0) numStack1.push(numStack.pop().getNum(); while(symbolStack.countSymbol