首页 > 其他分享 >Android财付通App(完整文件,实验报告,演示视频)

Android财付通App(完整文件,实验报告,演示视频)

时间:2024-06-05 23:58:52浏览次数:18  
标签:findViewById App cursor void new et Android 财付 id

移动数据库应用开发大作业

题目: 基于Android平台的理财通软件开发

学 院: 信息工程学院

专 业: 网络工程

班 号:

学生姓名:

指导教师:

基于 android 平台的理财通软件开发

学生姓名:饶明昌班级:170461

指导老师:邬志红

摘要:当今我们生活在一个数字信息化的时代,随着 GPRS、GSM、CDMA、蓝牙、 RFID、WLAN、WIFI、3G 和 4G 等无线技术的飞速发展,以及云端技术的不断成熟,大数据时代已经到来,智能手机已经发展了十多个年头。当今主流品牌手机的操作系统有 Android安卓)iOS苹果)Windows Phone微软)Symbian塞班)、BlackBerry OS(黑莓),而Android系统凭借其自由及开源性代码迅速在全球占有绝大多数的市场份额。

伴随着科技的不断创新,传统行业也试图通过转型以顺应时代的发展。近些年国家经济发展很快,人民的消费水平也越来越高,但是在现代社会中,很多人对于自己的消费没有严格的控制,特别是如今的商品种类越来越丰富,广告打得也越来越多样化,而且今下年轻人的自制力明显不足,月光族随处可见,甚至消费经常超过自己的经济能力,这样会产生严重影响到正常生活轨迹的后果。而开发一款记账APP则能解决这一问题,让用户对自己的消费有所记录。该APP具备手动记账的基本功能,并能通过数据库管理相关数据。设计最终实现了用户登录功能模块、新增收入功能模块、收入明细功能模块、新增支出功能模块、支出明细功能模块、数据分析功能模块等。通过测试,该系统能够正常运行,各个界面交互性良好。在系统规划时采用了系统功能结构图,并分析了系统所需的各种数据表,详细地展示了系统的各个功能模块,并给出了主要功能的运行效果图。

关键词:Android平台 记账APP 客户端 数据库

目录

第一章 绪 论1.1 研究的背景及意义1.2 研究的内容及方法第二章 设计原理和相关技术2.1 构架概述·2.2 关键技术简介·2.3 开发工具配置·2.4 应用平台·第三章 系统需求分析3.1 系统功能分析3.2 可行性分析·3.3 总体设计原则第四章 系统概要设计4.1 系统总体框架设计4.1.1 系统物理架构4.1.2 系统功能模块的设计4.2 数据库设计4.2.1 数据库结构设计4.2.2 数据库表设计4.2.3 数据库的创建与实现第五章 系统详细设计与实现5.1 客户端功能设计5.1.1 欢迎界面5.1.2用户登录模块5.1.3 用户注册模块5.1.4 新增收入模块5.1.5 收入明细模块5.1.6 新增支出模块5.1.7 支出明细模块5.1.8 数据分析模块5.1.9 系统设置模块5.1.10 修改和删除模块第六章 系统的测试及调试第七章 结论

1 绪 论

1.1 研究的背景及意义

近些年国家经济发展很快,人民的消费水平也越来越高,但是在现代社会中,很多人对于自己的消费没有严格的控制,特别是如今的商品种类越来越丰富,广告打得也越来越多样化,而且今下年轻人的自制力明显不足,月光族随处可见,甚至消费经常超过自己的经济能力,这样会产生严重影响到正常生活轨迹的后果。

那么我们是否可以提供一个解决方案,比如说开发一款理财app,让用户可以记录自己的收入与支出情况,并且对自己的收入与支出情况进行分析,这便是我开发这个app的初衷。因此,这个app的开发对于解决上述问题有着很大的现实意义。

1.2 研究的内容和方法

本论文介绍了基于Android平台的理财通软件的整个开发过程。论文详尽论述了从需求分析、概要分析、系统详细设计与实现以及系统调试与测试的整个设计思路。首先全面地研究了理财通软件开发的背景和意义,剖析了市场上主流软件的运行模式,从而得出设计本软件的思路和方法。接着介绍了软件开发的Android平台环境,利用Android内置的SQLite数据库进行数据管理。本软件以Android为平台采用Java语言进行编程,通过一些前端控件实现信息的输入和验证。在系统规划中需要用数据流程图、实体属性图分析数据间的各种关系,全面展示了本设计所要实现的功能模块并给出了各个功能的运行界面图。

理财通APP设计模式主要采用“模型-视图-控制器”MVC架构。利用AndroidStudio的开发环境(IDE)编写JAVA源代码以实现各模块的功能。

系统概要设计分为客户端操作设计和数据库设计两部分。详细设计主要阐述了用户管理,收入管理,支出管理等功能的实现,并列出了系统的核心功能代码。最后对各个功能模块进行了测试,测试结果表明:系统基本具备了完善的功能,视觉上简洁流畅,并且各个功能界面具有良好的交互性。

2 设计原理和相关技术

2.1 构架概述

本软件主要实现的是对支出和收入进行记录、管理、分析,设计最终实现了用户的注册,登录,权限验证,信息记录、信息修改,数据分析等功能。经过测试软件能够正常的运行,各个界面的交互逻辑与体验良好。在整个的设计中运用RecylerView对收入和支出信息展示进行设计,数据分析采用GitHub上的MPAndroidChart开源图表库,并通过SQLite对数据库进行操作。

理财通软件主要采用“模型-视图-控制器”MVC架构的设计模式。MVC架构英文全称是“Model-View-Controller”,MVC 应用程序总是由这三个部分组成。Model 是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数 据库中存取数据。View 是应用程序中处理数据显示的部分,通常视图是依据模型数 据创建的。Controller 是应用程序中处理用户交互的部分,通常控制器负责从视图读 取数据,控制用户输入,并向模型发送数据。其组件类型关系和功能如图 2.1 所示:

图2.1 MVVM组件类型关系和功能图

2.2 关键技术简介

RecyclerView控件

RecyclerView是Android5.0发布的时候推出的一个全新控件,可以支持API 7以上的版本。展示的效果类似于ListView,是列表形式。RecyclerView提供了一种插拔式的体验,高度解耦、灵活和高效。使用LayoutManger、ItemDecoration、ItemAnimator可以实现很多复杂的效果。

SQLite数据库

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,SQLite的主要优势在于灵巧、快速和可靠性高。Android Studio内置了这一数据库供开发者使用。

MPAndroidChart开源图表库

MpAndroidChart是一个开源图表库,它能实现多种常见的图表类型,如:折线图,饼图,堆叠图等。此外它还提供了一些对图表的操作功能,如:拖拽,缩放,显示标签等。这个第三方库能满足一般性图表开发需求。

2.3 开发工具配置

Android Studio

Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。

2.4 应用平台

Android 平台

Android 平台的特点:以 Linux 为核心且为开源性代码。Android 的系统架构采用 分层的架构。android 分为四个层,分别是应用程序层、应用程序框架层、系统运行 库层和 Linux 核心层。对普通的一个 Android 应用程序来讲,一般都是由 Activity、 Intent Receiver、Service、Content Provider 四个部分组成的。另外,Android 应用程 序还需要一个清单文件,叫做 AndroidManifest.xml 文件,在这个文件中对该应用程 序所要用到的每一个活动进行申明,并且定义组件的功能和 intent-filter 等。

Android 解析意图的方法:主要是通过查找在清单文件中已经过注册的相关组件 的 ID 及过滤器(intent filter)找到当中所合适的组件,然后该应用这些组件达到组件 之间的相关匹配。在 Android 框架应用处理 Intent 方法 的过程中,主要通过该 Intent 的三个属性,即动作,数据类型及类别来进行解释。其中顺序次要,先辨别动作的相关匹配程度,如果不匹配的话那么就进行数据类型之间的的解析,如果数据类型仍然不是很匹配的话,则进行相适应的数据格式之间的解析。

Android 的系统架构如图 2.2 所示:

图 2.2Android 系统架构图

3 系统需求分析

3.1 系统功能分析

理财通软件的开发目标客户是一般用户,用户通过Android手机在应用商店下载apk应用程序,安装好后可以注册使用本软件。经分析,该软件完成的功能主要有手机应用客户端程序。该系统在功能和使用性方面应达到如下要求:

(1) 操作简便,页面交互逻辑清晰,交互性良好。界面保持一致性,操作控制等要有反馈,界面保持效率,流程简化,表意清晰明确。

(2) 即时可见:用户对数据的更改能立即在视图中显示出来。

(3) 系统运行应满足快速、高效和稳定,要求页面最大响应时间不可以超过 10s。

(4) 在结构上应具备良好的可扩展性,便于今后功能的扩展和维护。

3.2 可行性分析

此次设计是基于 Android 平台开发的理财通软件。Android 平台为开发者 提供了巨大的开发空间,再运用 JAVA 面向对象语言能够使该系统的功能更加强大。 利用其内置的SQLite数据库建立本系统所需的各种表可以让其数据更加安全可靠。可行性分析也称为可行性研究,主要用于在系统未进行开发之前,对应用开发使用的可行性,系统要实现的功能以及系统如何实现这些功能,系统开发所使用到的技术,系统开发使用到的结构以及系统开发过程中的花费等进行调研,并得到可行性研究报告。得到这一报告后,便可以对系统进行针对性的研究,得到系统的可行性分析。

3.3 总体设计原则

1、开放性、可扩充性、可靠性原则

一款软件投入市场后要想拥有很高的市场占有率,必须满足开放性。能够支持公共的标准,易于扩展升级,兼容性较强。从而适应广大用户需求的多变性和产品的更新换代。

2、良好的用户操作界面

用户操作界面美观、方便、实用,使用户能在较短的时间内掌握其使用方法。 3、实用性原则

实用性需要从开发者和使用者的角度去考虑。一方面,系统越规范,标准化程度 越高,开发者的工作效率也会越高。另一方面,使用者不需要花费太多的学习成本,这样有利于产品的推广和使用。

4、工作平台设计原则

要求系统兼容性好,确保在不同的平台上都能正常工作,而且在各种网络都能够正常运行。

4 系统概要设计

系统的概要设计主要是概述系统的总体功能如何设计,如何按不同功能来划分模块以及系统所用的数据库如何设计等进行研究。本章节为系统的详细设计埋下伏笔。在系统的设计过程中扮演着非常重要的角色

4.1 系统总体框架设计

本方案主要Android客户端,SQLite数据库.终端设备能实现用户的注册,登录,权限验证,信息记录、信息修改,数据分析等功能。

4.1.1 技术选型

在本设计中,Android 客户端选用 Java 技术,数据的存储采用 SQLite 数据库。

4.1.2系统功能模块设计

在系统功能分析中已简单描述了本系统所具有的主要功能,为了更加直观地了解 本系统的各功能模块及它们之间的逻辑关系,采用系统功能结构图的形式展开,整个结构关系如图 4.1 所示:

图4.1 系统功能结构图

由系统功能结构图可知,系统客户端主要由以下几个模块构成:用户注册和登录、添加新增收入、添加新增支出、对收入和支出进行管理、对数据进行分析等。各模块逻辑关系及功能介绍如下:

1.用户登录:为了增强APP的使用安全,使用APP之前需要进行用户登录验证,而登录过程会在后台的数据库通过用户名称和密码进行查询。所以只有注册用户才有权限使用该系统;

2.主页面信息:系统登录成功后便进入了主页面界面,该页面六个Button控件显示六个子功能模块,六个textView控件显示每一个子功能的名称,便于用户选择要进行的操作。

3.新增收入:单击新增收入按钮后可进入页面添加收入信息,在此页面可以记录自己的收入详情,为日后的收入分析做准备。

4.收入明细:当添加完新增收入信息后,可以返回主页面选择点击收入明细按钮,点击按钮后,系统跳转到收入明细界面,在这里可以查看所有记录的新增收入信息,让自己的收入信息一目了然。

5.新增支出:和新增收入类似,单击新增支出按钮后可进入页面添加支出信息,在此页面可以记录自己的支出详情,为日后的支出分析做准备。

6.支出明细: 和收入明细类似,单击支出明细按钮后可进入页面查看所有记录的新增支出信息,让自己的支出信息一目了然。

7.数据分析:添加了很多收入和支出信息,怎样才能让自己对自己的收支有一个更全面的了解了,图表化是一个很好的选择。在这里用户可以看到根据类别显示的金额数据,并且是用折线的形式现实的。

8.系统设置:点击系统设置按钮,可以修改当前用户密码,也可以获取到当前用户的用户名,如果觉得自己的密码设置的不安全可以使用此功能。

4.2 数据库设计

4.2.1 数据库结构设计

数据库的支持是理财通APP能够实现信息管理的重要前提,其结构设计是系统总体设计阶段非常重要的一个环节。数据库设计要按用户具体要求,在 DBMS 中设计其结构和创建数据库。好的的数据库一般有完整的信息和紧凑的结构。此外,数据调用会很便捷,代码编写也较清晰。

4.2.2 数据库表设计

通过需求分析和E-R图分析,使用SQLite创建了名为financial.db的数据库,总共包含以下三张表,分别是用户信息表(tb_userinfo),收入表(in_come),支出表(pay_out)。financial.db数据库中各数据表的具体结构如图4.2所示:

图 4.2 数据表结构

1.用户信息表(tb_userinfo)

用户信息表用以保存用户的注册信息,主要包含编号(id),姓名(name),密码(pwd),邮箱地址(Email),电话号码(phone)。tb_userinfo表的结构如表4.1所示:

表 4.1 tb_userinfo 表结构

序号字段名称字段含义数据类型长度备注
1id编号int11主键
2name姓名varchar10
3pwd密码varchar15
4email邮箱地址varchar50
5phone电话号码varchar11

用户信息表中保存了所有注册用户的信息,其信息存储状态如图4.3所示:

图4.3用户信息表

2.收入表

收入表用以保存用户输入的收入明细信息,主要包含编号(id),收入金额(inmoney),收入时间(intime),收入类型(intype),付款方(inpayer),备注信息(inremark)。in_come表的结构如表4.2所示:

表 4.2 in_come 表结构

序号字段名称字段含义数据类型长度备注
1id编号int0主键
2inmoney收入金额double0
3intime收入时间varchar20
4intype收入类型varchar30
5inpayer付款方varchar100
6inremark备注信息varchar500

收入表中保存了用户输入的所有收入信息,其信息存储状态如图4.4所示:

图 4.4收入信息表

3.支出表(pay_out)

支出表用以保存用户输入的支出明细信息,主要包含编号(id),支出金额(outmoney),支出时间(outtime),支出类型(outtype),收款方(outpayee),备注信息(outremark)。pay_out表的结构如表4.3所示:

表 4.3 in_come 表结构

序号字段名称字段含义数据类型长度备注
1id编号int0主键
2outmoney支出金额double0
3outtime支出时间varchar20
4outtype支出类型varchar30
5outpayee收款方varchar100
6outremark备注信息varchar500

支出表中保存了用户输入的所有支出信息,其信息存储状态如图4.5所示:

图 4.5支出信息表

4.2.3 数据库的创建与实现

本软件所使用的编程语言是java语言,采用AndroidStudio内置的SQLite数据库存储信息。

public class MyDBHelper extends SQLiteOpenHelper {

private static final String DBNAME="financial.db";

private static final int VERSION=1;

public MyDBHelper(Context context) {

super(context, DBNAME, null, VERSION);

}

//1 创建数据库

@Override

public void onCreate(SQLiteDatabase db) {

//创建用户表

db.execSQL("create table tb_userinfo(id integer primary key autoincrement,name varchar(10),pwd varchar(15),email varchar(50),phone varchar(11))");

//创建收入表

db.execSQL("create table in_come(id integer primary key autoincrement,inmoney double,intime varchar(20),intype varchar(30),inpayer varchar(100),inremark varchar(500))");

//创建支出表

db.execSQL("create table pay_out(id integer primary key autoincrement,outmoney double,outtime varchar(20),outtype varchar(30),outpayee varchar(100),outremark varchar(500))");

}

//2 升级数据库

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

5 系统详细设计和实现

本系统的详细设计主要基于Android4.0开发平台,对需要完成系统概要设计中所有功能进行详细设计,所以是整个设计中最关键的一个环节。下面将全面对系统各个功能的实现进行分析。

5.1 客户端功能设计

APP界面主要包含欢迎,用户注册,登录,权限验证,信息记录、信息修改,数据分析等模块。经统计大致有12个运行界面,每个功能模块为用户提供相应的功能,通过vue-router的路由机制实现各个模块的跳转,界面效果整体统一,以简介为主,布局合理,符合操作逻辑,不需要太多的学习成本。

5.1.1 欢迎模块

欢迎界面主要是给用户一个好的第一印象,让用户点开app能得到美的享受,同时欢迎界面也能起到宣传的作用。欢迎运行界面如图5.1所示

图5.1 欢迎运行界面

5.1.2 用户登录模块

考虑到安全性的问题,本程序采用的是用户名和密码验证机制,运行后,进入登录页面后,需要进行登录验证,若此时用户名或密码为空,点击登录会提示“登录名是不能”;若所填的用户名不存在,或用户名正确而密码错误,都会提示“用户名或者密码错误,请重新输入”。当用户名和密码都填写正确时,系统将 成功登录理财通系统首页。流程如图5.2所示:

图 5.2登录流程图

要实现 Android 客户端的登录功能,需要以下几个步骤:

1.创建一个 Android 工程,命名为“RMCFinacial”。

2.在工程 res\layout 目录下创建一个名为“activity_login.xml”的布局文件,最外层使用 LinearLayout 布局。然后在内层嵌套 LinearLayout horizontal布局界面布局。该布局文件中引用了一张图像来显示背景图片,两个 EditText 用来输入用户名称和密码以及一个 Button 用来登录系统。

3.再创建一个名为“LoginActivity”的 Activity,在类里面声明用到的 EditText和Button 组件,然后在 onCreat()方法中调用 setContentView(R.layout.activity_login)方法 设置布局视图,并通过 findViewById()方法实例化 EditText 和 Button 对象。

4.为了便于用户清楚当前操作,还需要定义一个显示提示信息的Toast方法。 5.为了对用户名称和密码进行非空验证,需要定义 btnLogin()方法。

6.为登录按钮添加单击监听器,在 onClick 方法中,若登录成功,系统就会进入首页界面, 否则提示登录失败,若验证失败则会提示失败信息,请求用户和重新输入。

部分功能实现的核心代码如下:

public class LoginActivity extends AppCompatActivity {
//1 定义对象
EditText et_nameet_pwd;
Button btn_newregisterbtn_login;
MyDBHelper mhelper;
SQLiteDatabase db;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//2 绑定控件
initView();

//3 登录按钮功能的实现
btnLogin();

//4 新用户注册按钮功能的实现
btnNewRegister();
}

//2 绑定控件--------------------代码
private void initView() {
et_name = findViewById(R.id.et_name_lg);
et_pwd = findViewById(R.id.et_pwd_lg);
btn_newregister = findViewById(R.id.bt_newregister_lg);
btn_login = findViewById(R.id.bt_login_lg);
mhelper new MyDBHelper(LoginActivity.this);
db mhelper.getWritableDatabase();
}


//3 登录按钮功能的实现---------------------------代码
private void btnLogin() {
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//首先:获取输入的用户名和密码
String inputname = et_name.getText().toString();
String inputpwd = et_pwd.getText().toString();
//其次:对获取的用户名和密码进行判断
if (inputname.equals("") || inputpwd.equals("")) {//用户名或密码为空
Toast.makeText(LoginActivity.this"用户名或密码不能为空", Toast.LENGTH_SHORT).show();
else {//用户名或密码不为空时,我们再对输入的正确性进行判断。
// 根据输入的用户名和密码从数据库中查询
Cursor cursor = db.rawQuery("select * from tb_userinfo where name=? and pwd=?"new String[]{inputname, inputpwd});
//根据查询到的结果进行判断
if (cursor.moveToNext()) {//查询到时
String getname = cursor.getString(cursor.getColumnIndex("name"));
String getpwd = cursor.getString(cursor.getColumnIndex("pwd"));
if (inputname.equalsIgnoreCase(getname) && inputpwd.equalsIgnoreCase(getpwd)) {
SharedPreferences.Editor editor = getSharedPreferences("userinfo", 0).edit();
editor.putString("username", inputname);
editor.putString("userpwd", inputpwd);
editor.commit();
Toast.makeText(LoginActivity.this"用户名和密码正确,欢迎登陆", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
else {//没有查询到结果时
Toast.makeText(LoginActivity.this"用户名或密码错误,请重新输入", Toast.LENGTH_SHORT).show();
et_name.setText("");
et_pwd.setText("");
}
}
}
});

}

//4 新用户注册按钮功能的实现------------------------代码
private void btnNewRegister() {
btn_newregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
finish();
}
});
}


}

用户登录程序运行结果如图5.3,5.4所示

图 5.3登入未输入用户名和密码 图 5.4登入成功

5.1.3 用户注册模块

用户的注册功能的实现,首先创建一个注册页面RegisterActivity,注册时要求输入用户名,密码,邮箱,电话号码。

部分核心代码如下:

public class RegisterActivity extends AppCompatActivity {
//3定义对象
EditText et_name,et_pwd,et_email,et_phone;
Button btn_register,btn_cancel;
MyDBHelper mhelper;//创建一个数据库类文件
SQLiteDatabase db;//创建一个可以操作的数据库对象


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);

//4 绑定控件
initView();


//5 注册按钮功能的实现
btnRegister();

//6 取消按钮功能的实现
btnCancel();
}

//4 绑定控件--------代码
private void initView() {
et_name=findViewById(R.id.et_name_rg);
et_pwd=findViewById(R.id.et_pwd_rg);
et_email=findViewById(R.id.et_email_rg);
et_phone=findViewById(R.id.et_phone_rg);
btn_register=findViewById(R.id.bt_ok_rg);
btn_cancel=findViewById(R.id.bt_cancel_rg);
mhelper=new MyDBHelper(RegisterActivity.this);
db=mhelper.getWritableDatabase();
}

//5 注册按钮功能的实现--------------------代码
private void btnRegister() {
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个对象,用来封装一行数据
ContentValues values=new ContentValues();
values.put("name",et_name.getText().toString());//将输入的用户名放到name列
values.put("pwd",et_pwd.getText().toString());//将输入的密码放到pwd列
values.put("email",et_email.getText().toString());//将输入的邮箱放到email列
values.put("phone",et_phone.getText().toString());//将输入的电话放到phone列

//将封装好的一行数据保存到数据库的tb_userinfo表中
db.insert("tb_userinfo",null,values);
Toast.makeText(RegisterActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});

}

//6 取消按钮功能的实现-------------------代码
private void btnCancel() {
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
}
}

注册界面如图5.5所示

图5.5 注册界面

5.1.4 新增收入模块

新增收入模块功能的实现,首先创建一个NewInComeActivity页面,将用户输入的内容保存到数据库的收入表中。

部分核心代码:

public class NewInComeActivity extends AppCompatActivity {
//1 定义对象
EditText et_money,et_time,et_payer,et_remark;
Spinner sp_type;
Button bt_sava,bt_cancel;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_in_come);

//2 绑定控件
initView();
//3保存按钮功能的实现
btnSave();

//4 取消按钮功能的实现
btnCancel();

}


//2 绑定控件-------------------代码
private void initView() {
et_money=findViewById(R.id.et_money_newin);
et_time=findViewById(R.id.et_time_newin);
sp_type=findViewById(R.id.sp_type_newin);
et_payer=findViewById(R.id.et_payer_newin);
et_remark=findViewById(R.id.et_remark_newin);
bt_sava=findViewById(R.id.bt_save_newin);
bt_cancel=findViewById(R.id.bt_cancel_newin);
mhelper=new MyDBHelper(NewInComeActivity.this);
db=mhelper.getWritableDatabase();
}

//3保存按钮功能的实现--------代码
private void btnSave() {
bt_sava.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的内容保存到数据库的收入表中
ContentValues values=new ContentValues();
values.put("inmoney",et_money.getText().toString());
values.put("intime",et_time.getText().toString());
values.put("intype",sp_type.getSelectedItem().toString());
values.put("inpayer",et_payer.getText().toString());
values.put("inremark",et_remark.getText().toString());
db.insert("in_come",null,values);
Toast.makeText(NewInComeActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
//刷新本页面
Intent intent=new Intent(NewInComeActivity.this,NewInComeActivity.class);
startActivity(intent);
finish();
}
});
}

//4 取消按钮功能的实现--------代码
private void btnCancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(NewInComeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}

}

注册界面如图5.6所示

图 5.6 新增收入页面

5.1.5 收入明细模块

收入明细页面主要是将用户之前输入的信息显示到一个RecyclerView布局中,所以需要准备数据,设计子布局,定义适配器,并且将适配器和布局管理器加载到控件中。

部分核心代码:

public class InComeDetailActivity extends AppCompatActivity {
//1 定义对象
RecyclerView recy_view;
MyDBHelper mhelper;
SQLiteDatabase db;
List<IncomeBean> arr1=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_come_detail);
//2 绑定控件
initView();

//3 准备数据
initData();

//4 设计每一行的子布局

//5定义适配器: 数据和子布局关联起来(桥梁的作用)
IncomeAdapter adapter=new IncomeAdapter(InComeDetailActivity.this,arr1);

//6将适配器和布局管理器加载到控件当中
StaggeredGridLayoutManager st=new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);
recy_view.setLayoutManager(st);
recy_view.setAdapter(adapter);
}

//2 绑定控件----------------代码
private void initView() {
recy_view=findViewById(R.id.recy_view_indetail);
mhelper=new MyDBHelper(InComeDetailActivity.this);
db=mhelper.getWritableDatabase();
}

//3 准备数据----------------代码
private void initData() {
//从数据库查询所有的新增收入信息,取出数据
Cursor cursor=db.rawQuery("select * from in_come",null);
while(cursor.moveToNext()){
int myid=cursor.getInt(cursor.getColumnIndex("id"));
double mymoney=cursor.getDouble(cursor.getColumnIndex("inmoney"));
String mytime=cursor.getString(cursor.getColumnIndex("intime"));
String mytype=cursor.getString(cursor.getColumnIndex("intype"));
String mypayer=cursor.getString(cursor.getColumnIndex("inpayer"));
String myremark=cursor.getString(cursor.getColumnIndex("inremark"));
IncomeBean incomeBean=new IncomeBean( myid,mymoney,mytime,mytype,mypayer,myremark);
arr1.add(incomeBean);
}

}

}

子布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/in_detail_bg"
tools:context=".activity.InComeDetailActivity">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_view_indetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="40dp"/>
</LinearLayout>

收入明细运行界面如图5.7所示:

图5.7 收入明细页面

5.1.6 新增支出模块

新增支出模块功能的实现,首先创建一个NewPayActivity页面,将用户输入的内容保存到数据库的支出表中。

部分核心代码:

public class NewPayActivity extends AppCompatActivity {
//定义对象
EditText et_money,et_time,et_payer,et_remark;
Spinner sp_type;
Button bt_sava,bt_cancel;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_pay);

//2 绑定控件
initView();
//3保存按钮功能的实现
btnSave();

//4 取消按钮功能的实现
btnCancel();
}

//2 绑定控件-------------------代码
private void initView() {
et_money=findViewById(R.id.et_money_newout);
et_time=findViewById(R.id.et_time_newout);
sp_type=findViewById(R.id.sp_type_newout);
et_payer=findViewById(R.id.et_payer_newout);
et_remark=findViewById(R.id.et_remark_newout);
bt_sava=findViewById(R.id.bt_save_newout);
bt_cancel=findViewById(R.id.bt_cancel_newout);
mhelper=new MyDBHelper(NewPayActivity.this);
db=mhelper.getWritableDatabase();
}

//3保存按钮功能的实现--------代码
private void btnSave() {
bt_sava.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的内容保存到数据库的收入表中
ContentValues values=new ContentValues();
values.put("outmoney",et_money.getText().toString());
values.put("outtime",et_time.getText().toString());
values.put("outtype",sp_type.getSelectedItem().toString());
values.put("outpayee",et_payer.getText().toString());
values.put("outremark",et_remark.getText().toString());
db.insert("pay_out",null,values);
Toast.makeText(NewPayActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
//刷新本页面
Intent intent=new Intent(NewPayActivity.this,NewPayActivity.class);
startActivity(intent);
finish();
}
});
}

//4 取消按钮功能的实现--------代码
private void btnCancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(NewPayActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}

收入明细运行界面如图5.8所示:

图 5.8 新增支出页面

5.1.7 支出明细模块

支出明细页面主要是将用户之前输入的信息显示到一个RecyclerView布局中,所以需要准备数据,设计子布局,定义适配器,并且将适配器和布局管理器加载到控件中。

部分核心代码:

public class PayDetailActivity extends AppCompatActivity {
//1定义对象
RecyclerView recy_view;
MyDBHelper mhelper;
SQLiteDatabase db;
List<OutpayBean> arr1=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay_detail);

//2 绑定控件
initView();

//3 准备数据
initData();

//4 设计每一行的子布局

//5 创建适配器
OutpayAdapter adapter=new OutpayAdapter(PayDetailActivity.this,arr1);

//6将适配器和布局管理器加载到控件当中
StaggeredGridLayoutManager st=new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);
recy_view.setLayoutManager(st);
recy_view.setAdapter(adapter);

}

//2 绑定控件----------------代码
private void initView() {
recy_view=findViewById(R.id.recy_view_outdetail);
mhelper=new MyDBHelper(PayDetailActivity.this);
db=mhelper.getWritableDatabase();
}

//3 准备数据------------------代码
private void initData() {
//从数据库查询所有的新增收入信息,取出数据
Cursor cursor=db.rawQuery("select * from pay_out",null);
while(cursor.moveToNext()){
int myid=cursor.getInt(cursor.getColumnIndex("id"));
double mymoney=cursor.getDouble(cursor.getColumnIndex("outmoney"));
String mytime=cursor.getString(cursor.getColumnIndex("outtime"));
String mytype=cursor.getString(cursor.getColumnIndex("outtype"));
String mypayer=cursor.getString(cursor.getColumnIndex("outpayee"));
String myremark=cursor.getString(cursor.getColumnIndex("outremark"));
OutpayBean outpayBean=new OutpayBean( myid,mymoney,mytime,mytype,mypayer,myremark);
arr1.add(outpayBean);
}

}

}

子布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/pay_detail_bg"
tools:context=".activity.PayDetailActivity">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_view_outdetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="40dp"/>
</LinearLayout>

收入明细运行界面如图5.9所示:

图 5.9 新增支出页面

5.1.8 数据分析模块

数据分析页面主要是将用户之前输入的收入和支出信息通过图表的形式直观的显示出来,并且需要根据分类来显示。步骤是获取数据,对XY轴进行设计,将曲线进行初始化设置,将曲线展示出来。支出和收入分析的步骤是类似的。

部分核心代码:

public class DataAnalyseActivity extends AppCompatActivity {
//1 定义对象
LineChart income_chartoutpay_chart;
MyDBHelper mhelper;
SQLiteDatabase db;
String[] indata = {"学习-奖金""补助-奖金""比赛-奖励""业余-兼职""基本-工资""福利-分红""加班-津贴""其他"};
//收入类型数据统计的初始值
int xxjjmoney = 0;
int bzjjmoney = 0;
int bsjlmoney = 0;
int yyjzmoney = 0;
int jbgzmoney = 0;
int flfhmoney = 0;
int jbjtmoney = 0;
int qtmoney = 0;
String[] outdata = {"电影-娱乐""美食-畅饮""欢乐-购物""手机-充值""交通-出行""教育-培训""社交-礼仪""生活-日用""其他"};
//收入类型数据统计的初始值
int dyylmoney = 0;
int mscymoney = 0;
int hlgwmoney = 0;
int sjczmoney = 0;
int jtcxmoney = 0;
int jypxmoney = 0;
int sjlymoney = 0;
int shrymoney = 0;
int othermoney = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_analyse);
//2 绑定控件
initView();

//3 收入汇总分析
inComeData();

//4 支出汇总分析
outComeData();

}


//2 绑定控件---------------代码
private void initView() {
income_chart = findViewById(R.id.income_chart_data);
outpay_chart = findViewById(R.id.outpay_chart_data);
mhelper new MyDBHelper(DataAnalyseActivity.this);
db mhelper.getWritableDatabase();
}

//3 收入汇总分析-------------------代码
private void inComeData() {
//第一部分:获取数据
Cursor cursor = db.rawQuery("select * from in_come"null);
while (cursor.moveToNext()) {
Double mymoney = cursor.getDouble(cursor.getColumnIndex("inmoney"));
String mytype = cursor.getString(cursor.getColumnIndex("intype"));
if (mytype.equals("学习-奖金")) {
xxjjmoney += mymoney;
else if (mytype.equals("补助-奖金")) {
bzjjmoney += mymoney;
else if (mytype.equals("比赛-奖励")) {
bzjjmoney += mymoney;
else if (mytype.equals("业余-兼职")) {
yyjzmoney += mymoney;
else if (mytype.equals("基本-工资")) {
jbgzmoney += mymoney;
else if (mytype.equals("福利-分红")) {
flfhmoney += mymoney;
else if (mytype.equals("加班-津贴")) {
jbjtmoney += mymoney;
else if (mytype.equals("其他")) {
qtmoney += mymoney;
}
}

//第二部分:LineChart图表初始化设置---Xy轴的设置
XAxis xAxis = income_chart.getXAxis();//获取此图表的x轴轴线
YAxis yAxisleft = income_chart.getAxisLeft();//获取此图表的Y轴左侧轴线
YAxis yAxisright = income_chart.getAxisRight();//获取此图表的Y轴右侧轴线
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴线的位置为底部
yAxisleft.setAxisMinimum(0f);//保证Y轴从0开始,不然会上移一点。
yAxisright.setAxisMinimum(0f);
xAxis.setValueFormatter(new IAxisValueFormatter() {//x轴自定义标签的设置
@Override
public String getFormattedValue(float v, AxisBase axisBase) {
return indata[(int) v];
}
});

//第三部分:LineDataSet曲线初始化设置
List<Entry> inentries = new ArrayList<>();//Y轴的数据
inentries.add(new Entry(0, xxjjmoney));
inentries.add(new Entry(1, bzjjmoney));
inentries.add(new Entry(2, bsjlmoney));
inentries.add(new Entry(3, yyjzmoney));
inentries.add(new Entry(4, jbgzmoney));
inentries.add(new Entry(5, flfhmoney));
inentries.add(new Entry(6, jbjtmoney));
inentries.add(new Entry(7, qtmoney));
LineDataSet lineDataSet = new LineDataSet(inentries, "金额");//代表一条线,“金额”是曲线名称
lineDataSet.setValueTextSize(25);//曲线上文字的大小
lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
lineDataSet.setDrawFilled(true);//设置折线图填充


//第四部分:曲线展示
LineData data = new LineData(lineDataSet);//创建LineData对象 属于LineChart折线图的数据集合
income_chart.setData(data);// 添加到图表中
}

//4 支出汇总分析--------------------代码
private void outComeData() {
//第一部分:获取数据
Cursor cursor = db.rawQuery("select * from pay_out"null);
while (cursor.moveToNext()) {
Double mymoney = cursor.getDouble(cursor.getColumnIndex("outmoney"));
String mytype = cursor.getString(cursor.getColumnIndex("outtype"));
if (mytype.equals("电影-娱乐")) {
dyylmoney += mymoney;
else if (mytype.equals("美食-畅饮")) {
mscymoney += mymoney;
else if (mytype.equals("欢乐-购物")) {
hlgwmoney += mymoney;
else if (mytype.equals("手机-充值")) {
sjczmoney += mymoney;
else if (mytype.equals("交通-出行")) {
jtcxmoney += mymoney;
else if (mytype.equals("教育-培训")) {
jypxmoney += mymoney;
else if (mytype.equals("社交-礼仪")) {
sjlymoney += mymoney;
else if (mytype.equals("生活-日用")) {
shrymoney += mymoney;
else if (mytype.equals("其他")) {
othermoney += mymoney;
}
}

//第二部分:LineChart图表初始化设置---Xy轴的设置
XAxis xAxis = outpay_chart.getXAxis();//获取此图表的x轴轴线
YAxis yAxisleft = outpay_chart.getAxisLeft();//获取此图表的Y轴左侧轴线
YAxis yAxisright = outpay_chart.getAxisRight();//获取此图表的Y轴右侧轴线
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴线的位置为底部
yAxisleft.setAxisMinimum(0f);//保证Y轴从0开始,不然会上移一点。
yAxisright.setAxisMinimum(0f);
xAxis.setValueFormatter(new IAxisValueFormatter() {//x轴自定义标签的设置
@Override
public String getFormattedValue(float v, AxisBase axisBase) {
return outdata[(int) v];
}
});

//第三部分:LineDataSet曲线初始化设置
List<Entry> outentries = new ArrayList<>();//Y轴的数据
outentries.add(new Entry(0, dyylmoney));
outentries.add(new Entry(1, mscymoney));
outentries.add(new Entry(2, hlgwmoney));
outentries.add(new Entry(3, sjczmoney));
outentries.add(new Entry(4, jtcxmoney));
outentries.add(new Entry(5, jypxmoney));
outentries.add(new Entry(6, sjlymoney));
outentries.add(new Entry(7, shrymoney));
outentries.add(new Entry(8, othermoney));
LineDataSet lineDataSet = new LineDataSet(outentries, "金额");//代表一条线,“金额”是曲线名称
lineDataSet.setValueTextSize(25);//曲线上文字的大小
lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
lineDataSet.setDrawFilled(true);//设置折线图填充


//第四部分:曲线展示
LineData data = new LineData(lineDataSet);//创建LineData对象 属于LineChart折线图的数据集合
outpay_chart.setData(data);// 添加到图表中
}

}

收入明细运行界面如图5.10所示:

图 5.10 新增支出页面

5.1.9 系统设置模块

系统设置页面的作用是修改密码,目的是如果用户对自己的密码安全性不够满意时可做修改。

部分核心代码:

public class SysSettingActivity extends AppCompatActivity {
//1 定义对象
TextView txt_user;//创建一个显示用户名的文本对象
EditText et_ypwdet_xpwdet_zxpwd;// 创建三个EditText对象
Button bt_modifybt_cancel;// 创建两个Button对象
MyDBHelper mhelper;
SQLiteDatabase db;
String name;
String pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sys_setting);

//第二步:绑定控件
initView();

//第三步:显示当前登录的用户名
displayInfo();

//第四步:修改按钮功能
btnModify();

//第五步:取消按钮功能
btncancel();

}


//第二步:绑定控件-----------------代码
private void initView() {
txt_user=findViewById(R.id.txt_name_sys);
et_ypwd=findViewById(R.id.et_ypwd_sys);
et_xpwd=findViewById(R.id.et_xpwd_sys);
et_zxpwd=findViewById(R.id.et_zxpwd_sys);
bt_modify=findViewById(R.id.bt_modify_sys);
bt_cancel=findViewById(R.id.bt_cancel_sys);
mhelper=new MyDBHelper(SysSettingActivity.this);
db=mhelper.getWritableDatabase();
}


//第三步:显示当前登录的用户名-------代码
private void displayInfo() {
name=getSharedPreferences("userinfo",0).getString("username","");
pwd=getSharedPreferences("userinfo",0).getString("userpwd","");
txt_user.setText(name);
}

//第四步:修改按钮功能----------------------代码
private void btnModify() {
bt_modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取三个输入框中的内容
String ypwd = et_ypwd.getText().toString();//获取输入的原密码
String xpwd = et_xpwd.getText().toString();//获取输入的新密码
String zxpwd = et_zxpwd.getText().toString();//获取第二次输入的新密码
//对每个密码进行逻辑判断
if(ypwd.equals("")){
Toast.makeText(SysSettingActivity.this"请输入原始密码", Toast.LENGTH_SHORT).show();
}else if(!ypwd.equalsIgnoreCase(pwd)){
Toast.makeText(SysSettingActivity.this"输入的密码与原密码不一致", Toast.LENGTH_SHORT).show();
}else if(xpwd.equals("")){
Toast.makeText(SysSettingActivity.this"请输入新密码", Toast.LENGTH_SHORT).show();
}else if(xpwd.equalsIgnoreCase(ypwd)){
Toast.makeText(SysSettingActivity.this"所输入的新密码与原密码不能相同", Toast.LENGTH_SHORT).show();
}else if(zxpwd.equals("")){
Toast.makeText(SysSettingActivity.this"请再次输入新密码", Toast.LENGTH_SHORT).show();
}else if(!zxpwd.equalsIgnoreCase(xpwd)){
Toast.makeText(SysSettingActivity.this"两次输入的新密码不一致", Toast.LENGTH_SHORT).show();
}else{
ContentValues values =new ContentValues();
values.put("pwd",xpwd);
db.update("tb_userinfo",values,"name=?",new String[]{name});
Toast.makeText(SysSettingActivity.this"密码修改成功", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(SysSettingActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
}
});
}
//第五步:取消按钮功能-----------------------代码
private void btncancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SysSettingActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}

}

系统设置界面如图5.11所示:

图 5.11 新增支出页面

5.1.10 修改和删除模块

修改和删除页面的作用是修改用户之前输入的新增收入或新增支出信息。 如果修改使用update,如果删除,使用delete。

部分核心代码:

public class InManageActivity extends AppCompatActivity {
//1 定义对象
private EditText et_moneyet_timeet_payeret_remark;
private Spinner sp_type;
private Button btn_modifybtn_delete;
private MyDBHelper mhelper;
private SQLiteDatabase db;
private IncomeBean incomeBean;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_manage);

//2 绑定控件
initView();

//3 获取单击的那条数据并显示出来
getDataDisplay();

//4 修改按钮功能的实现
btnModidfy();


//5 删除按钮功能的实现
btnDelete();
}

//2 绑定控件-----------------------代码
private void initView() {
et_money = findViewById(R.id.et_money_inmag);
et_time = findViewById(R.id.et_time_inmag);
sp_type = findViewById(R.id.sp_type_inmag);
et_payer = findViewById(R.id.et_payer_inmag);
et_remark = findViewById(R.id.et_remark_inmag);
btn_modify = findViewById(R.id.bt_modify_inmag);
btn_delete = findViewById(R.id.bt_delete_inmag);
mhelper new MyDBHelper(InManageActivity.this);
db mhelper.getWritableDatabase();

}

//3 获取单击的那条数据并显示出来--------------------代码
private void getDataDisplay() {
incomeBean = (IncomeBean) getIntent().getSerializableExtra("seri");
et_money.setText(incomeBean.getMoney() + "");
et_time.setText(incomeBean.getTime());
//sp_type.setPrompt(incomeBean.getType());
if (incomeBean.getType().equals("学习-奖金")) {
sp_type.setSelection(1);
else if (incomeBean.getType().equals("补助-奖金")) {
sp_type.setSelection(2);
else if (incomeBean.getType().equals("比赛-奖励")) {
sp_type.setSelection(3);
else if (incomeBean.getType().equals("业余-兼职")) {
sp_type.setSelection(4);
else if (incomeBean.getType().equals("基本-工资")) {
sp_type.setSelection(5);
else if (incomeBean.getType().equals("福利-分红")) {
sp_type.setSelection(6);
else if (incomeBean.getType().equals("加班-津贴")) {
sp_type.setSelection(7);
else if (incomeBean.getType().equals("其他")) {
sp_type.setSelection(8);
else {
sp_type.setSelection(0);
}

et_payer.setText(incomeBean.getPayer());
et_remark.setText(incomeBean.getRemark());
}


//4 修改按钮功能的实现--------------------代码
private void btnModidfy() {
btn_modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个对象,封装一行数据
ContentValues values = new ContentValues();
values.put("inmoney"et_money.getText().toString());
values.put("intime"et_time.getText().toString());
values.put("intype"sp_type.getSelectedItem().toString());
values.put("inpayer"et_payer.getText().toString());
values.put("inremark"et_remark.getText().toString());
//把该行数据更新到到收入表中
db.update("in_come", values, "id=?"new String[]{incomeBean.getId() + ""});
Toast.makeText(InManageActivity.this"修改成功", Toast.LENGTH_SHORT).show();
//关闭本页面,重新打开收入明细界面,即可查询修改后的结果
// 创建Intent对象
Intent intent = new Intent(InManageActivity.this, InComeDetailActivity.class);
startActivity(intent);// 执行Intent操作
finish();//退出当前程序,或关闭当前页面
}
});
}

//5 删除按钮功能的实现-------------------代码
private void btnDelete() {
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//从数据库中删除条记录即可
db.delete("in_come""id=?"new String[]{incomeBean.getId() + ""});
Toast.makeText(InManageActivity.this"删除成功", Toast.LENGTH_SHORT).show();
//关闭本页面,重新打开收入明细界面,即可删除后的结果
// 创建Intent对象
Intent intent = new Intent(InManageActivity.this, InComeDetailActivity.class);
startActivity(intent);// 执行Intent操作
finish();//退出当前程序,或关闭当前页面
}
});
}

}

收入明细运行界面如图5.12,5.13所示:

图 5.12 收入管理页面 图 5.113 支出管理页面

6 系统的测试及调试

基本的开发完成后,将APP进行Apk打包,安装到自己的真机上使用。

当完成系统的详细设计后,需要对系统各功能模块进行完整的测试及调试,在测试过程中会发现好多问题,只有通过不断地修正和优化,才能使系统更加稳定和可靠。在调试过程中还可以优化部分代码,使整体的代码结构更加紧凑和精简。为确保系统每个功能都能正常稳定地实现,测试中需以单个模块逐个测试,经过多次反复的测试,本系统在设计过程中出现过以下问题:

  1. 在代码编写过程中由于各个功能模块命名不规范,导致后期出现过很多细节 上的问题,比如首字母大小写区别,后来在调用程序时由于字段不统一导致程序出错,不过在测试时会生成相应的错误报告信息,相对来说还是比较容易更正的。
  2. 在代码编写完成后,做了初步测试,但发现系统始终不能正常运行,查看日志信息发现是内存溢出异常,查阅了很多相关资料,最终确定问题出在初始启动页面错误上。

系统测试与调试的过程能够加深对本设计具体要求的理解。经过前期的需求分析、概要设计以及系统详细设计等过程,真正体会到软件设计的精髓,即规划、整理和思维创新。每一个微小的设计细节都会影响到整个软件成型的质量。

7 结论

本次的研究的课题是一个移动端APP的开发。本次课题所涉及的知识点很多都是自己以前不太清楚的,算是对自己的一个挑战了。通过Java开发技术的运用,功能 模块化的设计以及后期系统测试与调试,此系统所要求的功能已基本实现。通过一段时间的的开发过程,对一个应用的开发流程有了更全面的了解。

此外,有序的软件开发管理流程可以让整个开发过程变得更有条理和高效,而系统的需求分析与系统概要设计显得尤为重要。需求分析是整个系统开发流程的开头,确定了本设计的工作方向,只有明确了目标,对预期的功能有个初步的描述,才能在之后制定更详细的设计步骤,更加有效的管理系统功能布局,并按预期的目标去逐步靠近。而系统概要设计为系统详细设计提供了重要的理论依据和技术指导。

本软件从前期的需求分析到系统测试运行的成功标志着整个开发流程的结束。但由于自身能力的局限,本系统还需后期不断地优化和升级。特别是考虑到用户的各方面需求,还可以在系统里添加一些更具人性化的功能设计,比如添加一个显示总收入的TextView控件,添加根据日期显示的图表化功能等。有了这些子功能,可以让用户的体验感更好,能更好的管理自己的收入和支出,成为金钱的主人,早日实现财富自由。

希望能够通过不断地探索和学习,逐步学习和应用新的技术,能够进一步去完善该系统的功能。

标签:findViewById,App,cursor,void,new,et,Android,财付,id
From: https://blog.csdn.net/m0_66999594/article/details/139441127

相关文章

  • 鞋子商店APP源码和设计报告PPT(包调试成功)
    实验报告课程名称实验名称指导教师专业班级学号姓名一、需求分析1.需求分析随着互联网和手机技术的蓬勃发展,网购已经成为许多人,尤其是年轻人的主要消费方式,这就对手机购物APP产生了大量的需求,商品的展示环节更是尤为重要的额一环。本次实验制作了一款鞋子商品展示......
  • 体重档案APP源码和设计报告(含答辩PPT,包调试成功)
    1移动媒体程序设计实现课程设计报告课题名称:体重档案APP小组小组成员:xxxxxxxxx目录1概述31.1项目背景31.2系统目标32需求分析42.1系统功能分析42.1.1数据保存42.1.2图标功能42.1.3诊断功能52.1.4更多功能52.2系统平台62.2.1Android开发环境介绍62.2.2Android开发平台搭建......
  • 01《android studio开发实战(第三版)》阅读笔记
    第一章:初识AndroidStudio本章介绍AndroidStudio的基本概念和安装步骤,帮助读者快速搭建开发环境。了解AndroidStudio的发展历史和其在Android开发中的地位。安装和配置:详细说明了如何在Windows、Mac和Linux系统上安装AndroidStudio,并进行必要的配置。创建第一个项目:通过......
  • uniapp-two-day-two之基础内容and滑动组件和滚动栏
    基础内容又是码农无聊的一天,今天也就上了一节早课,下课想学习的服了结果玩了半天手机,终于是在下午学上了,真的是很难控制自己。闲聊结束。text标签text中有上面这几个属性,其中在我看来selectable是挺重要的一个属性,是吧现在不都说是cv工程师吗?可不就是这个来组成了我们工程师......
  • 【Android面试题】请你分别采用递归和非递归对二叉树进行遍历?
    请你分别采用递归和非递归对二叉树进行遍历?这道题想考察什么?1、二叉树的基本原理和遍历的方法?考察的知识点二叉树遍历的基本概念、二叉树的基本原理考生如何回答二叉树的基本概念当然可以!二叉树是一种常见的数据结构,它由一组称为节点的元素构成。每个节点可以有零个......
  • CSAPP
    感悟:原来读名校和非名校的区别是这样的在以前的211的时候,我上一门叫《你应该知道的数学》的课程,那时老师给我们介绍各种历史留名的大数学家,言语之间流露出“你们只能读这个水平的学校,自然也很难做出什么大成就”。现在到了top3,在上CSAPP的时候,老师对我们的期待就变成了——你们......
  • Android应用程序启动源码浅析-(三万字长文慎点&Android14)
    在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层的启动流程。一、启动流程sequenceDiagramparticipantUserparticipantLauncherparticipantActivityManagerService......
  • Android Studio使用ADB远程调试(真机)(通过无线调试)
    准备工作1)设备:笔记本电脑、安卓手机2)设备连接相同网络(如:同个WIFI)3)手机开启开发者模块、USB调试、USB安装ps:本人安卓手机是红米手机,开启开发者模式可参考:https://baijiahao.baidu.com/s?id=1758792460891751075&wfr=spider&for=pc操作步骤1)打开AndroidStudio,通过File->Proje......
  • Android JSBridge 详解(背景和原理、特性和挑战、应用场景和实现方法)
    AndroidJSBridge详解(背景和原理、特性和挑战、应用场景和实现方法)JSBridge(JavaScriptBridge)是一种用于在JavaScript和Native代码之间进行通信的技术,常用于在Web应用中调用Native功能或在Native应用中嵌入Web页面。在Android平台上,JSBridge可以实现通过......
  • Java1.8语言+ springboot +mysql + Thymeleaf 全套家政上门服务平台app小程序源码
    Java1.8语言+springboot+mysql +Thymeleaf 全套家政上门服务平台app小程序源码家政系统是一套可以提供上门家政、上门维修、上门洗车、上门搬家等服务为一体的家政平台解决方案。它能够与微信对接、拥有用户端小程序,并提供师傅端app,可以帮助创业者在不需要相关技术人员及......