资源描述
《移动应用开发》课程设计汇报
学院名称: 计算机和信息工程学院
班级名称: 计科对口14
学生姓名: 胡闻璐
学 号: 215219
题 目: 基于《个人理财通》计算器
任课老师
姓 名: 刘东良
起止日期: 04月18日至04月30日
目 录
《移动应用开发》课程设计汇报 1
摘要 3
1 项目需求分析 3
1.1 需求分析 3
1.2 功效需求 3
2系统总体设计 5
2.1系统架构设计 5
2.2系统功效体系 5
3系统具体设计 6
3.1 数据库设计 6
3.2系统界面设计 7
3.3数据存放设计 13
3.4信息统计设计 14
3.5地图轨迹设计 14
3.6 服务应用设计 24
4系统编码实现 25
4.1框架引用 25
4.2交互实现 25
4.3单元测试 28
5 系统测试公布 29
5.1手机环境实测 29
5.2 APP公布实测 29
参考文件 30
成绩评定 31
摘要
伴随移动终端快速普及,Android系统平台引用软件需求随之增大。伴伴随Android智能手机和平板电脑已经出现在我们生活大量使用,越来越多基于Android开发平台也随之而出,为丰富大家使用Android智能产品用途,使其能够帮大家统计部分事情。本设计开发经过研究Android体系结构和个人理财管理方面知识,设计并实现了个人理财通系统。能够对理财信息进行获取、汇总、整理、计算等功效,从而实现随身随时随地地进行日常理财活动。
1 项目需求分析
1.1 需求分析
物质和科技飞速发展,大家生活水平也不停在提升,往往有大家在快节奏生活中迷失和迷茫,大家认为自己没钱,但每个月工资也不是很低,却往往不知道钱花在哪,为何每到月底自己钱包会空空如也,正因为这么,大家才需要一款个人理财软件,简单界面,易懂操作,十分便携直观理财方法,能够让大家愈加好进行个人理财。以下是本软件部分功效:
①登录界面:初始登陆时没有密码,为了方便用户保护隐私,能够自行设置密码
②新增支出:添加支出金额、时间、类别和地点等信息
③新增收入:添加收入金额、时间、类别和付款方等信息
④数据管理:支出汇总,收入汇总,便签信息
⑤便签功效:添加便签,设置提醒或事项
⑥计 算 器:对数据进行计算,方便统计,长按结果可直接复制
⑦移动课堂:泛雅平台中安卓课程访问
⑧帮 助:对个人理财通各个功效部件使用介绍
⑨退 出:退出该系统
1.2 功效需求
现在中国外理财软件已经有上百种之多,如美国直觉企业QUICKEN软件为美国13个州及加拿大用户提供金融管理和预算等财务问题。中国在财务管理方面做比较突出当属金蝶企业。然而,在手机理财软件方面做很突出还没有,本软件是针对个人用户一款Android软件,关键对个人理财收入、支出做一个统计和统计,能够对用户收入、支出统计做添加、删除、查询和修改管理,本软件该含有以下功效:
①功效操作要方便、易懂、,不要有多出或复杂操作。
②对用户收入支出信息做添加、删除、查询和修改。
③系统功效复合本人实际情况。
④界面直观简练,方便用户愈加好使用。
⑤确保软件安全性。
2系统总体设计
个人理财通
开启界面
登陆界面界面
新增支出
新增收入
我支出
我收入
数据管理
系统设置
收支便签
计算器
移动课堂
帮
助
退
出
2.1系统架构设计
图2-1 系统架构图
2.2系统功效体系
系统总体功效关键包含系统各功效模块具体划分和定义,和各子功效模
块具体实现细节,经过具体划分和定义细节能够将系统各功效进行有效区分,防
止功效重合,功效冗余等现象,系统总体功效分析如表2-2所表示.
用户功效
具体描述
新增支出
用户对新增支出财产进行具体统计
新增收入
在此处添加了计算器方便用户对收入/支出财产进行具体统计
我支出
用户对我支出财产统计进行具体查询
我收入
用户对我收入财产进行具体查询
数据管理
用户管理个人账户和虚拟账户等
系统设置
对手机系统进行规范化设置
收支便签
对财产收支进行统计
计算器
对数据进行计算,能够长按结果进行复制
移动课堂
学习泛亚平台中安卓课程
3系统具体设计
3.1 数据库设计
(1) 数据类型简明规则
程序中需要定义常量,变量,这些需要指定类型。下面介绍常见数据库类型,如表3-1 所表示。
数据类型
简写
整形
int
字符型
str
布尔型
bl
单精度浮点型
flt
双精度浮点型
dbl
表3-1 数据类型简明规则
(2) 组件命名规则
全部组件对象名称拼音简写,假如发觉冲突可采取不一样简写规则。组件命名如表3-2所表示。
控件
缩写形式
EditText
txt
Button
btn
Spinner
sp
ListView
lv
表3-2 组件命名规则
个人理财通是一款运行在Android系统上程序,在Android系统中,集成了一个轻量型数据库,即SQLite,该数据库是使用C语言编写开源嵌入式数据库,支持数据库大小为2TB,使用该数据库,用户能够像使用SQL Server数据库或Oracle数据库那样来存放、管理和维护数据,本系统采取了SQLite数据库,而且命名为account.db,,该数据库中用到了4个数据表,分别是tb_flag、tb_inaccount、tb_outaccount和tb_pwd。
3.2系统界面设计
1开启界面:清新简练开启界面,标识着个人理财通和开发者微博,提升整体软件美观程度,图3-1所表示。
图3-1
2. 用户登录:首次登录不需要密码,进去后可在系统设置里设置密码。因为本软件属于个人用户端,通常情况下只有本人使用,所以没有用户名,直接进入密码输入步骤,便于保护用户隐私,图3-2所表示。
图3-2
3. 用户登入后进入软件主界面,主界面包含软件全部功效图标,用户可依据需要使用,图3-3所表示。
图3-3
4. 计算器:基础加减乘除,能够方便用户对金额进行计算,从而方便统计,在本计算机中计算结果,能够长按结果进行复制,从而到收入支出页面进行快捷粘贴,图3-4、3-5所表示。
图3-4 图3-5
5.新增支出:此模块功效是添加用户新增支出。一样新增支出能够选择金额、时间、类别、地点和备注。类别能够选择餐费、应酬、礼金、车费和其它,长按金额后面填写框能够快捷复制计算器计算结果,图3-6、3-7所表示。
图3-6 图3-7
6. 新增收入:此模块功效是添加用户新增收入。在平时理财过程中,添加收入统计是很频繁操作,所以此模块为用户提供了一个很实用而且便捷操作过程。在这个模块中,用户能够添加收入信息统计内容包含:金额、时间、类别、付款方和备注。为了用户能够方便查看收入统计,故将收入类别进行了分类,具体分为五类,分别为工资、兼职、分红、奖金、其它,长按金额后面填写框能够快捷复制计算器计算结果,图3-8、3-9所表示。
图3-8 图3-9
7. 我支出、我收入:当在新增收入模块进行了添加操作后,添加收入统计就会显示在模块中。在这两个界面中能够清楚看到全部统计,图3-10、3-11所表示。
图3-10 图3-11
8. 数据管理:对于家庭理财系统来说,数据管理功效是很关键一个功效,它关键是管理支出、收入和便签统计信息,图3-12所表示。
图3-12
9.系统设置:让用户来设置密码。密码设置成功后,用户再次登录时就需要所设置密码,图3-13所表示。
图3-13
10.新增便签,关键实现添加便签统计。便签模块能够统计将要进行收入或支出信息,也就是相当于备忘录功效,图3-14所表示。
图3-14
11. 移动课堂:泛雅平台移动应用开发学习界面,用户能够在这里学习安卓相关知识,图3-15所表示。
图3-15
12. 帮助:《个人理财通》使用帮助,用于处理在系统中碰到问题,图3-16所表示。
图3-16
13.退出:用户点击退出图标后回到登录界面。
3.3数据存放设计
package cn.edu.chzu.xxy.sp15.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;// 定义数据库版本号
private static final String DBNAME = "account.db";// 定义数据库名
public DBOpenHelper(Context context){// 定义结构函数
super(context, DBNAME, null, VERSION);// 重写基类结构函数
}
@Override
public void onCreate(SQLiteDatabase db){// 创建数据库
db.execSQL("create table tb_outaccount (_id integer primary key,money decimal,time varchar(10),"
+ "type varchar(10),address varchar(100),mark varchar(200))");// 创建支出信息表
db.execSQL("create table tb_inaccount (_id integer primary key,money decimal,time varchar(10),"
+ "type varchar(10),handler varchar(100),mark varchar(200))");// 创建收入信息表
db.execSQL("create table tb_pwd (password varchar(20))");// 创建密码表
db.execSQL("create table tb_flag (_id integer primary key,flag varchar(200))");// 创建便签信息表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){// 覆写基类onUpgrade方法,方便数据库版本更新
}
}
3.4信息统计设计
当点击支出汇总、收入汇总或便签信息时,下方就会出现全部支出、收入或便签信息。图3-17、3-18所表示。
图3-17 图3-18
3.5地图轨迹设计
package cn.edu.chzu.xxy.sp15.hwl;
/**
* 计算器项目
*/
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.GridLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
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;// C、DEL
// 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;// 0,1,2,3,4
// private Button btn_5, btn_6, btn_7, btn_8, btn_9;// 5,6,7,8,9 ∞
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
// 布局
// 动态设置Gridlayout中控件宽度,使其全屏匹配屏幕
GridLayout gridlayout = (GridLayout) findViewById(R.id.gridlayout_c);
ViewTreeObserver vto = gridlayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
GridLayout gl = (GridLayout) findViewById(R.id.gridlayout_c);
fillview(gl);
ViewTreeObserver obs = gl.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
// 取得每个按钮点击事件
initViews();
}
// 为每个Button设置了onClick属性
public void onClick(View view) {
switch (view.getId()) {
// 0-9
case R.id.btn_0:
button0Function();
break;
case R.id.btn_1:
button1Function();
break;
case R.id.btn_2:
button2Function();
break;
case R.id.btn_3:
button3Function();
break;
case R.id.btn_4:
button4Function();
break;
case R.id.btn_5:
button5Function();
break;
case R.id.btn_6:
button6Function();
break;
case R.id.btn_7:
button7Function();
break;
case R.id.btn_8:
button8Function();
break;
case R.id.btn_9:
button9Function();
break;
case R.id.btn_dian:
buttonDianFunction();
break;
// C
case R.id.btn_c:
buttonClear();
break;
// DEL
case R.id.btn_del:
buttonDel();
break;
// +
case R.id.btn_jia:
buttonJiaYunSuanFunction();
break;
// -
case R.id.btn_jian:
buttonJianYunSuanFunction();
break;
// X
case R.id.btn_cheng:
buttonChengYunSuanFunction();
break;
// ÷
case R.id.btn_chu:
buttonChuYunSuanFunction();
break;
// =
case R.id.btn_dengyu:
buttonDengYuFunction();
break;
default:
Button b = (Button) view;
Toast.makeText(this, b.getText(), Toast.LENGTH_SHORT).show();
break;
}
}
/* ============================= */
/* private 私有方法 */
/* =========================== */
private void fillview(GridLayout gl) {
Button buttontemp;
GridLayout.LayoutParams params;
for (int i = 0; i < gl.getChildCount(); i++) {
buttontemp = (Button) gl.getChildAt(i);
params = (LayoutParams) buttontemp.getLayoutParams();
params.width = (gl.getWidth() / gl.getColumnCount())
- params.rightMargin - params.leftMargin;
buttontemp.setLayoutParams(params);
}
}
// 初始化全部控件
private void initViews() {
textView = (TextView) findViewById(R.id.calculate_textview);
mCopy = (Button) findViewById(R.id.fz);
mCopy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成方法存根
if (textView.getText().toString().equals("")) {
Toast.makeText(Calculator.this, "結果為空", Toast.LENGTH_SHORT)
.show();
return;
}
}
});
}
private void printDebugInfo(String str) {
if (isDebug) {
Log.i("TAG", "Debug: " + str);
}
}
// 往Textv尾部追加内容
private void appendTextView(String str) {
CharSequence text = textView.getText();
text = text + str;
printDebugInfo(text.toString());
textView.setText(text);
}
// 添加数字按钮功效start===========================
// 对于0输入注意点:
// 1、当还没有输入时,就是textview显示为0时,什么全部不用做,继续保持为0
// 2、当textview显示不为0时,在textview尾部追加一个0
// 问题:判定条件怎样来确定。有两个方案
// 1、获取textview内容,然后调用比较方法,是否和0相等
// 2、设置一个Boolean标识,当textview第一次输入不为0时,将标识设为true,然后依据标识来进行0按钮功效实现
// 对比:方案一有点简单,缺点相对来说耗性能。每次全部要读取textview值然后进行比较;方案二有点性能上比第一个高,不过控制条件比第一个复杂
// 0按钮功效
private void button0Function() {
if (isTextViewInputted && !textView.getText().toString().equals("0")) {
// 条件成立,textview值不是0
appendTextView("0");
} else if (!textView.getText().toString().equals("0")) {
textView.setText("0");// 当有运算操作后,isTextViewInputted为false时,需要把textView设置为0
}
}
// 假如已经有输入了,则在textview尾部追加一,是第一次输入则将textview显示改为1.此规则一样适适用于其它数字按钮
// 1按钮功效
private void button1Function() {
if (isTextViewInputted) {
appendTextView("1");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("1");
}
}
// 2按钮功效
private void button2Function() {
if (isTextViewInputted) {
appendTextView("2");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("2");
}
}
// 3按钮功效
private void button3Function() {
if (isTextViewInputted) {
appendTextView("3");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("3");
}
}
// 4按钮功效
private void button4Function() {
if (isTextViewInputted) {
appendTextView("4");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("4");
}
}
// 5按钮功效
private void button5Function() {
if (isTextViewInputted) {
appendTextView("5");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("5");
}
}
// 6按钮功效
private void button6Function() {
if (isTextViewInputted) {
appendTextView("6");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("6");
}
}
// 7按钮功效
private void button7Function() {
if (isTextViewInputted) {
appendTextView("7");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("7");
}
}
// 8按钮功效
private void button8Function() {
if (isTextViewInputted) {
appendTextView("8");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("8");
}
}
// 9按钮功效
private void button9Function() {
if (isTextViewInputted) {
appendTextView("9");
} else {
// 第一次进行输入
isTextViewInputted = true;
textView.setText("9");
}
}
// 添加数字按钮功效end===========================
// 功效四代码start=========================
// C按钮功效,清除屏幕使其显示0,而且改变输入状态是未输入
private void buttonClear() {
if (isTextViewInputted) {
isTextViewInputted = false;
textView.setText("0");
} else if (!textView.getText().toString().equals("0")) {
textView.setText("0");
}
}
// DEL按钮功效,当有输入时,每次点击删除最终一位字符。当只有一个字符时,将显示变成0,而且改变输入状态为未输入
private void buttonDel() {
if (isTextViewInputted) {
CharSequence text = textView.getText();
int length = text.length();
if (length > 1) {
if (length == 2) {
// 假如在只有2个字符而且第一个还为0情况,这时候假如再删除最终一位时只剩下一个0,所以输入状态要改为false
char c = text.charAt(0);
if (c == '0') {
isTextViewInputted = false;
}
}
text = text.subSequence(0, length - 1);// 截取前面部分内容,上网搜索CharSequence和subSequence()方法
textView.setText(text);
printDebugInfo(textView.getText().toString());
} else {
buttonClear();// 调用清除功效
}
} else if (!textView.getText().toString().equals("0")) {
textView.setText("0");
}
}
// 功效四代码end=========================
// 运算符号添加标准:
// 1、假如textview最终一个字符不是运算符,则直接在末尾添加,而且修改输入状态为true,激活0和DEL按钮功效
// 2、假如最终一个字符是运算符时,替换最终一个字符为目前点击运行符
// 运算符号 start========================
// +按钮功效
private void buttonJiaYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text = textView.getText();
int length = text.length();
char c = text.charAt(length - 1);
if (c == CJia) {
printDebugInfo("已经是+号运算符了");
return;
} else if (c == CJian || c == CCheng || c == CChu) {
text = text.subSequence(0, length - 1) + SJia;
textView.setText(text);
} else {
appendTextView(SJia);
}
} else {
isTextViewInputted = true;
appendTextView(SJia);
}
}
// -按钮功效
private void buttonJianYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text = textView.getText();
int length = text.length();
char c = text.charAt(length - 1);
if (c == CJian) {
printDebugInfo("已经是-号运算符了");
return;
} else if (c == CJia || c == CCheng || c == CChu) {
text = text.subSequence(0, length - 1) + SJian;
textView.setText(text);
} else {
appendTextView(SJian);
}
} else {
isTextViewInputted = true;
appendTextView(SJian);
}
}
// X按钮功效
private void buttonChengYunSuanFunction() {
if (isTextViewInputted) {
CharSequence text = textView.getText();
int length = text.length();
char c = text.charAt(length - 1);
展开阅读全文