收藏 分销(赏)

《移动应用开发》课程设计.doc

上传人:丰**** 文档编号:4342835 上传时间:2024-09-08 格式:DOC 页数:28 大小:1.90MB 下载积分:10 金币
下载 相关 举报
《移动应用开发》课程设计.doc_第1页
第1页 / 共28页
《移动应用开发》课程设计.doc_第2页
第2页 / 共28页


点击查看更多>>
资源描述
《移动应用开发》课程设计报告 学院名称: 计算机与信息工程学院 班级名称: 计科对口14 学生姓名: 胡闻璐 学 号: 2015215219 题 目: 基于《个人理财通》得计算器 任课教师 姓 名: 刘东良 起止日期: 2017年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);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服