学院名称: 计算机信息工程学院
班级名称: 计科口
学生姓名:
学 号:
题 目: 基理财通计算器
课教师
姓 名:
起止日期: 2017年04月18日04月30日
目 录
移动应开发课程设计报告 1
摘 3
1 项目需求分析 3
11 需求分析 3
12 功需求 3
2系统总体设计 5
21系统架构设计 5
22系统功体系 5
3系统详细设计 6
31 数库设计 6
32系统界面设计 7
33数存储设计 13
34信息统计设计 14
35图轨迹设计 14
36 服务应设计 24
4系统编码实现 25
41框架引 25
42交互实现 25
43单元测试 28
5 系统测试发布 29
51手机环境实测 29
52 APP发布实测 29
参考文献 30
成绩评定 31
摘
着移动终端迅速普Android系统台引软件需求增伴着Android智手机板电脑已出现生活量越越基Android开发台出丰富Android智产品途帮记录事情设计开发通研究Android体系结构理财理方面知识设计实现理财通系统够理财信息进行获取汇总整理计算等功实现身时进行日常理财活动
1 项目需求分析
11 需求分析
物质科技飞速发展生活水断提高快节奏生活中迷失迷茫觉没钱月工资低知道钱花什月底钱包会空空正样需款理财软件简单界面易懂操作十分便携直观理财方式更进行理财软件功:
①登录界面:初始登陆时没密码方便户保护隐私行设置密码
②新增支出:添加支出金额时间类点等信息
③新增收入:添加收入金额时间类付款方等信息
④数理:支出汇总收入汇总便签信息
⑤便签功:添加便签设置提醒事项
⑥计 算 器:数进行计算方便记录长结果直接复制
⑦移动课堂:泛雅台中安卓课程访问
⑧帮 助:理财通功部件介绍
⑨退 出:退出该系统
12 功需求
目前国外理财软件已百种美国直觉公司QUICKEN软件美国13州加客户提供金融理预算等财务问题国财务理方面做较突出属金蝶公司然手机理财软件方面做突出没软件针户款Android软件理财收入支出做记录统计户收入支出记录做添加删查询修改理软件该具备功:
①功操作方便易懂余复杂操作
②户收入支出信息做添加删查询修改
③系统功复合实际情况
④界面直观简洁方便户更
⑤保证软件安全性
2系统总体设计
理财通
启动界面
登陆界面界面
新增支出
新增收入
支出
收入
数理
系统设置
收支便签
计算器
移动课堂
帮
助
退
出
21系统架构设计
图21 系统架构图
22系统功体系
系统总体功包括系统功模块详细划分定义子功模
块具体实现细节通详细划分定义细节系统功进行效区分防
止功重叠功冗余等现象系统总体功分析表22示
户功
具体描述
新增支出
户新增支出财产进行详细记录
新增收入
处添加计算器方便户收入支出财产进行详细记录
支出
户支出财产记录进行详细查询
收入
户收入财产进行详细查询
数理
户理账户虚拟账户等
系统设置
手机系统进行规范化设置
收支便签
财产收支进行记录
计算器
数进行计算长结果进行复制
移动课堂
学泛亚台中安卓课程
3系统详细设计
31 数库设计
(1) 数类型简规
程序中需定义常量变量需指定类型面介绍常见数库类型表31 示
数类型
简写
整形
int
字符型
str
布尔型
bl
单精度浮点型
flt
双精度浮点型
dbl
表31 数类型简规
(2) 组件命名规
组件象名称拼音简写果发现突采简写规组件命名表32示
控件
缩写形式
EditText
txt
Button
btn
Spinner
sp
ListView
lv
表32 组件命名规
理财通款运行Android系统程序Android系统中集成种轻量型数库SQLite该数库C语言编写开源嵌入式数库支持数库2TB该数库户SQL Server数库者Oracle数库样存储理维护数系统采SQLite数库命名accountdb该数库中4数表分tb_flagtb_inaccounttb_outaccounttb_pwd
32系统界面设计
1启动界面:清新简洁启动界面标识着理财通开发者微博提升整体软件美观程度图31示
图31
2 户登录:首次登录需密码进系统设置里设置密码软件属客户端通常情况没户名直接进入密码输入环节便保护户隐私图32示
图32
3 户登入进入软件界面界面包括软件功图标户根需图33示
图33
4 计算器:基加减方便户金额进行计算方便记录计算机中计算结果长结果进行复制收入支出页面进行快捷粘贴图3435示
图34 图35
5新增支出:模块功添加户新增支出样新增支出选择金额时间类点备注类选择餐费应酬礼金车费长金额面填写框快捷复制计算器计算结果图3637示
图36 图37
6 新增收入:模块功添加户新增收入时理财程中添加收入记录频繁操作模块户提供非常实便捷操作程模块中户添加收入信息记录容包括:金额时间类付款方备注户够方便查收入记录收入类进行分类具体分五类分工资兼职分红奖金长金额面填写框快捷复制计算器计算结果图3839示
图38 图39
7 支出收入:新增收入模块进行添加操作添加收入记录会显示模块中两界面中清楚记录图310311示
图310 图311
8 数理:家庭理财系统说数理功非常重功理支出收入便签记录信息图312示
图312
9系统设置:户设置密码密码设置成功户次登录时需设置密码图313示
图313
10新增便签实现添加便签记录便签模块记录进行收入支出信息相备忘录功图314示
图314
11 移动课堂:泛雅台移动应开发学界面户里学安卓关知识图315示
图315
12 帮助:理财通帮助解决系统中遇问题图316示
图316
13退出:户点击退出图标回登录界面
33数存储设计
package cneduchzuxxysp15dao
import androidcontentContext
import androiddatabasesqliteSQLiteDatabase
import androiddatabasesqliteSQLiteOpenHelper
public class DBOpenHelper extends SQLiteOpenHelper {
private static final int VERSION 1 定义数库版号
private static final String DBNAME accountdb 定义数库名
public DBOpenHelper(Context context){ 定义构造函数
super(context DBNAME null VERSION) 重写基类构造函数
}
@Override
public void onCreate(SQLiteDatabase db){ 创建数库
dbexecSQL(create table tb_outaccount (_id integer primary keymoney decimaltime varchar(10)
+ type varchar(10)address varchar(100)mark varchar(200))) 创建支出信息表
dbexecSQL(create table tb_inaccount (_id integer primary keymoney decimaltime varchar(10)
+ type varchar(10)handler varchar(100)mark varchar(200))) 创建收入信息表
dbexecSQL(create table tb_pwd (password varchar(20))) 创建密码表
dbexecSQL(create table tb_flag (_id integer primary keyflag varchar(200))) 创建便签信息表
}
@Override
public void onUpgrade(SQLiteDatabase db int oldVersion int newVersion){ 覆写基类onUpgrade方法便数库版更新
}
}
34信息统计设计
点击支出汇总收入汇总便签信息时方会出现支出收入便签信息图317318示
图317 图318
35图轨迹设计
package cneduchzuxxysp15hwl
**
* 计算器项目
*
import androidappActivity
import androidosBundle
import androidutilLog
import androidviewView
import androidviewViewOnClickListener
import androidviewViewTreeObserver
import androidviewViewTreeObserverOnGlobalLayoutListener
import androidwidgetButton
import androidwidgetGridLayout
import androidwidgetGridLayoutLayoutParams
import androidwidgetTextView
import androidwidgetToast
public class Calculator extends Activity {
private static final boolean isDebug true 判断项目否处debug调试模式控制否印log
char 进行判断
private static final char CJia '+'
private static final char CJian ''
private static final char CCheng '*'
private static final char CChu '÷'
String 进行显示
private static final String SJia +
private static final String SJian
private static final String SCheng *
private static final String SChu ÷
private TextView textView
private Button mCopy 複製鈕
private boolean isTextViewInputted false 判断textView否输入判断0钮功
private Button btn_c btn_del CDEL
private Button btn_jia btn_jian btn_chu btn_cheng +x÷
private Button btn_dian btn_dengyu
private Button btn_0 btn_1 btn_2 btn_3 btn_4 01234
private Button btn_5 btn_6 btn_7 btn_8 btn_9 56789 ∞
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState)
setContentView(Rlayoutactivity_calculator)
布局
动态设置Gridlayout中控件宽度全屏匹配屏幕
GridLayout gridlayout (GridLayout) findViewById(Ridgridlayout_c)
ViewTreeObserver vto gridlayoutgetViewTreeObserver()
vtoaddOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
GridLayout gl (GridLayout) findViewById(Ridgridlayout_c)
fillview(gl)
ViewTreeObserver obs glgetViewTreeObserver()
obsremoveGlobalOnLayoutListener(this)
}
})
获钮点击事件
initViews()
}
Button设置onClick属性
public void onClick(View view) {
switch (viewgetId()) {
09
case Ridbtn_0
button0Function()
break
case Ridbtn_1
button1Function()
break
case Ridbtn_2
button2Function()
break
case Ridbtn_3
button3Function()
break
case Ridbtn_4
button4Function()
break
case Ridbtn_5
button5Function()
break
case Ridbtn_6
button6Function()
break
case Ridbtn_7
button7Function()
break
case Ridbtn_8
button8Function()
break
case Ridbtn_9
button9Function()
break
case Ridbtn_dian
buttonDianFunction()
break
C
case Ridbtn_c
buttonClear()
break
DEL
case Ridbtn_del
buttonDel()
break
+
case Ridbtn_jia
buttonJiaYunSuanFunction()
break
case Ridbtn_jian
buttonJianYunSuanFunction()
break
X
case Ridbtn_cheng
buttonChengYunSuanFunction()
break
÷
case Ridbtn_chu
buttonChuYunSuanFunction()
break
case Ridbtn_dengyu
buttonDengYuFunction()
break
default
Button b (Button) view
ToastmakeText(this bgetText() ToastLENGTH_SHORT)show()
break
}
}
* *
* private 私方法 *
* *
private void fillview(GridLayout gl) {
Button buttontemp
GridLayoutLayoutParams params
for (int i 0 i < glgetChildCount() i++) {
buttontemp (Button) glgetChildAt(i)
params (LayoutParams) buttontempgetLayoutParams()
paramswidth (glgetWidth() glgetColumnCount())
paramsrightMargin paramsleftMargin
buttontempsetLayoutParams(params)
}
}
初始化控件
private void initViews() {
textView (TextView) findViewById(Ridcalculate_textview)
mCopy (Button) findViewById(Ridfz)
mCopysetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TODO 动生成方法存根
if (textViewgetText()toString()equals()) {
ToastmakeText(Calculatorthis 結果為空 ToastLENGTH_SHORT)
show()
return
}
}
})
}
private void printDebugInfo(String str) {
if (isDebug) {
Logi(TAG Debug + str)
}
}
Textv尾部追加容
private void appendTextView(String str) {
CharSequence text textViewgetText()
text text + str
printDebugInfo(texttoString())
textViewsetText(text)
}
添加数字钮功start
0输入注意点:
1没输入时textview显示0时什做继续保持0
2textview显示0时textview尾部追加0
问题:判断条件样确定两方案
1获取textview容然调较方法否0相等
2设置Boolean标记textview第次输入0时标记设true然根标记进行0钮功实现
:方案点简单缺点相说耗性次读取textview值然进行较方案二点性第高控制条件第复杂
0钮功
private void button0Function() {
if (isTextViewInputted && textViewgetText()toString()equals(0)) {
条件成立textview值0
appendTextView(0)
} else if (textViewgetText()toString()equals(0)) {
textViewsetText(0) 运算操作isTextViewInputtedfalse时需textView设置0
}
}
果已输入textview尾部追加第次输入textview显示改1规样适数字钮
1钮功
private void button1Function() {
if (isTextViewInputted) {
appendTextView(1)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(1)
}
}
2钮功
private void button2Function() {
if (isTextViewInputted) {
appendTextView(2)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(2)
}
}
3钮功
private void button3Function() {
if (isTextViewInputted) {
appendTextView(3)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(3)
}
}
4钮功
private void button4Function() {
if (isTextViewInputted) {
appendTextView(4)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(4)
}
}
5钮功
private void button5Function() {
if (isTextViewInputted) {
appendTextView(5)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(5)
}
}
6钮功
private void button6Function() {
if (isTextViewInputted) {
appendTextView(6)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(6)
}
}
7钮功
private void button7Function() {
if (isTextViewInputted) {
appendTextView(7)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(7)
}
}
8钮功
private void button8Function() {
if (isTextViewInputted) {
appendTextView(8)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(8)
}
}
9钮功
private void button9Function() {
if (isTextViewInputted) {
appendTextView(9)
} else {
第次进行输入
isTextViewInputted true
textViewsetText(9)
}
}
添加数字钮功end
功四代码start
C钮功清屏幕显示0改变输入状态未输入
private void buttonClear() {
if (isTextViewInputted) {
isTextViewInputted false
textViewsetText(0)
} else if (textViewgetText()toString()equals(0)) {
textViewsetText(0)
}
}
DEL钮功输入时次点击删位字符字符时显示变成0改变输入状态未输入
private void buttonDel() {
if (isTextViewInputted) {
CharSequence text textViewgetText()
int length textlength()
if (length > 1) {
if (length 2) {
果2字符第0情况时候果删位时剩0输入状态改false
char c textcharAt(0)
if (c '0') {
isTextViewInputted false
}
}
text textsubSequence(0 length 1) 截取前面部分容网搜索CharSequencesubSequence()方法
textViewsetText(text)
printDebugInfo(textViewgetText()toString())
} else {
buttonClear() 调清功
}
} else if (textViewgetText()toString()equals(0)) {
textViewsetText(0)
}
}
功四代码end
运算符号添加原:
1果textview字符运算符直接末尾添加修改输入状态true激活0DEL钮功
2果字符运算符时换字符前点击运行符
运算符号 start
+钮功
private void buttonJiaYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text textViewgetText()
int length textlength()
char c textcharAt(length 1)
if (c CJia) {
printDebugInfo(已+号运算符)
return
} else if (c CJian || c CCheng || c CChu) {
text textsubSequence(0 length 1) + SJia
textViewsetText(text)
} else {
appendTextView(SJia)
}
} else {
isTextViewInputted true
appendTextView(SJia)
}
}
钮功
private void buttonJianYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text textViewgetText()
int length textlength()
char c textcharAt(length 1)
if (c CJian) {
printDebugInfo(已号运算符)
return
} else if (c CJia || c CCheng || c CChu) {
text textsubSequence(0 length 1) + SJian
textViewsetText(text)
} else {
appendTextView(SJian)
}
} else {
isTextViewInputted true
appendTextView(SJian)
}
}
X钮功
private void buttonChengYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text textViewgetText()
int length textlength()
char c textcharAt(length 1)
if (c CCheng) {
printDebugInfo(已X号运算符)
return
} else if (c CJia || c CJian || c CChu) {
text textsubSequence(0 length 1) + SCheng
textViewsetText(text)
} else {
appendTextView(SCheng)
}
} else {
isTextViewInputted true
appendTextView(SCheng)
}
}
÷钮功
private void buttonChuYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text textViewgetText()
int length textlength()
char c textcharAt(length 1)
if (c CChu) {
printDebugInfo(已÷号运算符)
return
} else if (c CJia || c CJian || c CCheng) {
text textsubSequence(0 length 1) + SChu
textViewsetText(text)
} else {
appendTextView(SChu)
}
} else {
isTextViewInputted true
appendTextView(SChu)
}
}
点钮功
出现条件isTextViewInputtedtrue者0时
private void buttonDianFunction() {
if (isTextViewInputted) {
appendTextView()
} else if (textViewgetText()toString()equals(0)) {
appendTextView()
isTextViewInputted true
}
}
运算符号 end
钮功start
钮功较复杂重新规划进度说明进度务
钮实现需运java中String类
String类split方法根四运算符吧字符串分成段终数字运算符分离
数字字符串转化基数类型根运算符进行计算
实现步骤:
目前先做两数运行考虑输入正确情况条件判断进行
1先创建4方法应四运算中加减(写完加法算法进行测试时发现运算完第次点击数字钮时textView显示正常时显示刚点击钮数字
点击0时发现数显示前运算结果时需button0Function方法中加条件判断时候点击0时textView显示0)(样CDEL需处理情况)
2分析textview字符串容获取数字运算符进行运算出结果更改textview显示
3进行次等操作时候textview输入状态改false结束次运算
private void buttonDengYuFunction() {
String text textViewgetText()toString()
包含加减四运算中进行计算
if (textcontains(SJia) || textcontains(SJian)
|| textcontains(SCheng) || textcontains(SChu)) {
isTextViewInputted false
onlyOneOperator(text) 种运算符情况
}
}
private void onlyOneOperator(String text) {
boolean isFisrtWeiFu false 判断第否负数
左起第数负数时
if (textstartsWith()) {
text textsubstring(1) 第掉
isFisrtWeiFu true
}
运算符情况果数字加运算符结果数字身进行操作
boolean isInteger true 判断否全部int数
+
if (textcontains(SJia)) {
String[] arr textsplit([+]) 四运行中特殊符号需处理需理解split()方法
int length arrlength
float[] arrFlaotNumber new float[length]
for (int i 0 i < length i++) {
if (arr[i]contains()) {
isInteger false
}
arrFlaotNumber[i] FloatparseFloat(arr[i])
if (0 i && isFisrtWeiFu) {
arrFlaotNumber[i] arrFlaotNumber[i]
}
}
if (isInteger) {
全部int类型整数方法float数强转int
int[] arrIntNumber new int[length]
for (int i 0 i < length i++) {
arrIntNumber[i] (int) arrFlaotNumber[i]
}
textViewsetText(jiaFa(arrIntNumber) + )
} else {
textViewsetText(jiaFa(arrFlaotNumber) + )
}
}
else if (textcontains(SJian)) {
String[] arr textsplit([])
int length arrlength
float[] arrFlaotNumber new float[length]
for (int i 0 i < length i++) {
if (arr[i]contains()) {
isInteger false
}
arrFlaotNumber[i] FloatparseFloat(arr[i])
if (0 i && isFisrtWeiFu) {
arrFlaotNumber[i] arrFlaotNumber[i]
}
}
if (isInteger) {
果全部int类型整数方法
int[] arrIntNumber new int[length]
for (int i 0 i < length i++) {
arrIntNumber[i] (int) arrFlaotNumber[i]
}
textViewsetText(jianFa(arrIntNumber) + )
} else {
textViewsetText(jianFa(arrFlaotNumber) + )
}
}
else if (textcontains(SCheng)) {
String[] arr textsplit([*])
int length arrlength
float[] arrFlaotNumber new float[length]
for (int i 0 i < length i++) {
if (arr[i]contains()) {
isInteger false
}
arrFlaotNumber[i] FloatparseFloat(arr[i])
if (0 i && isFisrtWeiFu) {
arrFlaotNumber[i] arrFlaotNumber[i]
}
}
if (isInteger) {
果全部int类型整数方法
int[] arrIntNumber new int[length]
for (int i 0 i < length i++) {
arrIntNumber[i] (int) arrFlaotNumber[i]
}
textViewsetText(chengFa(arrIntNumber) + )
} else {
textViewsetText(chengFa(arrFlaotNumber) + )
}
}
÷
else if (textcontains(SChu)) {
String[] arr textsplit([÷])
int length arrlength
float[] arrFlaotNumber new float[length]
for (int i 0 i < length i++) {
if (arr[i]contains()) {
isInteger false
}
arrFlaotNumber[i] FloatparseFloat(arr[i])
if (0 i && isFisrtWeiFu) {
arrFlaotNumber[i] arrFlaotNumber[i]
}
}
if (isInteger) {
果全部int类型整数方法
int[] arrIntNumber new int[length]
for (int i 0 i < length i++) {
arrIntNumber[i] (int) arrFlaotNumber[i]
}
textViewsetText(chuFa(arrIntNumber) + )
} else {
textViewsetText(chuFa(arrFlaotNumber) + )
}
}
}
两数加法
private int jiaFa(int[] a) {
int result 0
for (int i 0 length alength i < length i++) {
result + a[i]
}
return result
}
两数减法
private int jianFa(int[] a) {
int result a[0]
for (int i 1 length alength i < length i++) {
result a[i]
}
return result
}
两数法
private int chengFa(int[] a) {
int result a[0]
for (int i 1 length alength i < length i++) {
result * a[i]
}
return result
}
两数法
private int chuFa(int[] a) {
int result a[0]
for (int i 1 length alength i < length i++) {
if (a[i] 0) {
return result
}
result a[i]
}
return result
}
进度10数计算数字中出现数时想float类型进行计算提供方法重载
两数加法
private float jiaFa(float[] a) {
float result 0
for (int i 0 length alength i < length i++) {
result + a[i]
}
return result
}
两数减法
private float jianFa(float[] a) {
float result a[0]
for (int i 1 length alength i < length i++) {
result a[i]
}
return result
}
两数法
private float chengFa(float[] a) {
float result a[0]
for (int i 1 length alength i < length i++) {
result * a[i]
}
return result
}
两数法
private float chuFa(float[] a) {
float result a[0]
for (int i 1 length alength i < length i++) {
if (a[i] 0) {
return result
}
result a[i]
}
return result
}
钮功end
}
36 服务应设计
移动课堂:
package cneduchzuxxysp15hwl
import androidappActivity
import androidcontentIntent
import androidosBundle
import androidosHandler
import androidviewWindow
import androidviewWindowManager
移动课堂
import androidwebkitWebView
import androidwebkitWebViewClient
public class FyClassActivity extends Activity {
WebView mWebView
@Override
protected void onCreate(Bundle savedInstanceState) {
TODO 动生成方法存根
superonCreate(savedInstanceState)
setContentView(Rlayoutactivity_fy_class)
mWebView (WebView) findViewById(Ridwebview)
mWebViewgetSettings()setSupportZoom(true)
mWebViewgetSettings()setBuiltInZoomControls(true)
mWebViewloadUrl(httpmooc1chaoxingcomcourse95609226html)
覆盖WebView默认第三方系统默认浏览器开网页行网页WebView开
mWebViewsetWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view String url) {
TODO Autogenerated method stub
返回值true时候控制WebView开false调系统浏览器第三方浏览器
viewloadUrl(url)
return true
}
})
}
}
4系统编码实现
41框架引
图41 图42
42交互实现
计算器:
androidlayout_heightmatch_parent
androidbackground#FFFFFF
androidorientationvertical >
androidlayout_widthmatch_parent
androidlayout_heightwrap_content
androidlayout_margin10dp
androidbackground#ffffff
androidgravityright
androidpaddingRight2dp
androidtext0
androidtextColor#6699ff
androidtextIsSelectabletrue
androidtextSize40sp >
androidlayout_height0dp
androidlayout_weight1 >
androidlayout_widthmatch_parent
androidlayout_heightwrap_content
androidlayout_margin10dp
androidcolumnCount4
androidrowCount5 >
< 第 0排 CDEL ÷ X >