Android Studio开发项目——记账簿应用

2024-03-12 22:12

本文主要是介绍Android Studio开发项目——记账簿应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目资源:

       百度网盘链接:https://pan.baidu.com/s/1zN9lrIypi1t_QpuoBcdBNQ?pwd=xj5h 
       提取码:xj5h

项目设计内容

1.基本功能描述

电子记账本是一种在线财务管理工具,用于帮助用户记录和管理他们的收入支出。以下是电子记账本的内容和基本功能的详细说明:

    1.1用户登录界面记账本启动后默认进入的界面,在该界面下已拥有账户的用户可以直接输入用户名和密码来进入记账本首页,新用户则需点击“注册”按钮以进入用户注册界面创建新用户信息。

    1.2用户注册界面:新用户需要设置一个用户名并设置密码才能使用电子记账本,一旦注册成功,用户就可以返回登录界面并通过输入用户名和密码来进入记账本首页

    1.3记账本首页:用户通过在成功登录后进入的页面,该页面主要用于跳转至其他功能性页面,包括新增数据、数据汇总、数据分析以及系统设置界面。

    1.4新增收入数据界面:用户可以在该界面中添加新的收入记录。包括收入的金额、日期、付款方和类别等信息。输入数据后点击“添加”按钮,系统即可将数据录入数据库中,以便后续的查询和汇总分析处理。

    1.5新增支出数据界面与新增收入界面类似,用户可该界面中添加新的支出记录包括支出的金额、日期、收款方和类别等信息。输入数据后点击“添加”按钮,系统即可将数据录入数据库中,以便后续的查询和汇总分析处理。

    1.6收入明细界面:该界面将列出用户在“新增收入”界面中录入的所有收入记录,为用户提供数据查询功能。

    1.7支出明细界面:与“收入明细”类似,该界面将列出用户在“新增支出”界面中录入的所有支出记录,为用户提供数据查询功能。

    1.8数据修改界面:用户可通过点击“收入/支出明细”界面中的数据直接跳转至对应数据的修改界面,在该界面下,用户可修改或删除当前的收入/支出数据,点击保存后,系统会将修改的新数据覆盖此前的旧数据。

    1.8数据汇总界面:电子记账本可以自动汇总用户的总收入和总支出,并计算出整体收支情况,这些汇总信息可以帮助用户了解他们的财务状况,并制定相应的预算计划。

    1.9数据分析界面:电子记账本利用折线统计图对数据走势进行统计分析,以帮助用户更好地理解他们的财务状况。

    1.10系统设置界面:如果用户想要更改他们的密码,他们可以在该界面下进行操作。通常,这需要输入当前的密码,然后输入新的密码并再次确认密码系统在确认新密码与旧密码不同且不为空,并且两次输入的新密码相同后,会用新的密码数据覆盖旧的密码数据,完成密码修改。

2.工作流程

图 1.1 记账本工作流程图

2.1记账簿工作流程如下:

       用户启动记账簿后,默认进入登录界面。已有账户的用户可在输入用户名和密码后直接点击“登录”按钮,系统在数据库的用户表中查询到对应的用户数据后即可进入记账本首页,没有相关信息的新用户则可在登录界面中点击“注册”按钮跳转至注册界面进行新用户信息的录入,成功注册后系统会将新的用户数据录入用户表中,随后即可返回用户登录界面进行登录。

       用户登录成功后进入首页,在该界面下,可点击对应图标跳转至各个功能界面。

       首次使用该记账本时,需先点击“新增收入”或“新增支出”进入对应界面进行收支数据的录入。输入数据并点击“保存”按钮后,系统会将输入的数据录入对应的收入/支出表中,便于后续的数据处理。

       返回记账簿首页,点击“收入明细”或“支出明细”即可进入对应的数据明细界面。在该页面下,系统会将此前用户在“新增”界面下录入的收支数据列出,便于用户进行数据查询。同时,在该界面下点击收支数据即可跳转至相应的数据修改界面,在数据修改界面用户可自行修改收支数据的各项属性,点击“修改”按钮,系统会将新的数据覆盖旧的数据,点击“删除”按钮,系统会将当前数据从数据库中删除,以此达到修改数据的目的。

       返回记账簿首页,点击首页顶部图片即可进入数据汇总界面,该界面中,系统从数据库中提取出收支金额并进行总和计算,得出总收入、总支出和整体收支情况,并列出,便于用户查看整体账目数据。

       返回记账簿首页,点击“数据分析”即可进入数据分析页面,该页面将此前“新增”或“修改”的数据处理后生成统计图,用户可以直观的查询收入或支出的变化。

       在首页点击“系统设置”以跳转至用户密码修改界面,该界面的左上角会标记出当前用户的名称,用户可以在该界面下修改自己的登录密码,系统核对新的密码与旧密码不同且不为空,并且与第二次输入的新密码相同后,会将新的密码数据录入数据库的用户表中,并覆盖旧的密码数据,以此达到修改密码的目的。

3.数据库设计

3.1项目相关数据库如表1.1、表1.2、表1.3所示。

用户表(tb_userinfo)

字段名

类型

属性

说明

ID

integer

PK,IDENTITY

用户ID

name

varchar(10)

NOT NULL

用户名

pwd

varchar(15)

NOT NULL

用户登录密码

表1.1

收入表(in_com)

字段名

类型

属性

说明

ID

integer

PK,IDENTITY

收入数据ID

inmoney

double

NULL

收入金额

intime

varchar(20)

NULL

收入时间

intype

varchar(30)

NULL

收入类型

inpayer

varchar(100)

NULL

付款方

inremark

varchar(500)

NULL

备注

表1.2

支出表(pay_out)

字段名

类型

属性

说明

ID

integer

PK,IDENTITY

支出数据ID

outmoney

double

NULL

支出金额

outtime

varchar(20)

NULL

支出时间

outtype

varchar(30)

NULL

支出类型

outpayee

varchar(100)

NULL

收款方

outremark

varchar(500)

NULL

备注

表1.3

4.程序运行结果

                                          

   图 4.1用户注册界面                          图 4.2用户登录界面                            图 4.3记账本首页

                                          

   图 4.4新增收入界面                           图 4.5新增支出界面                          图 4.6收入明细界面

                                          

    图 4.7支出明细界面                           图 4.8数据分析界面                            图 4.9系统设置界面

                    ​​​​​​​

   图 4.10数据修改界面                           图 4.11数据汇总界面

5.部分代码示例

      5.1新增收入页面

package com.example.tallybook.activity;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;import com.example.tallybook.R;
import com.example.tallybook.db.MyDBHelper;
import com.example.tallybook.view.Home;public class NewInComeActivity extends AppCompatActivity {EditText et_money,et_time,et_payer,et_remark;Spinner sp_type;Button bt_sava,bt_cancel;MyDBHelper mhelper;SQLiteDatabase db;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_new_in_come);initView();btnSave();btnCancel();}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_remake_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();}private void btnSave(){bt_sava.setOnClickListener(new View.OnClickListener(){@Overridepublic 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();}});}private void btnCancel() {bt_cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(NewInComeActivity.this, Home.class);startActivity(intent);finish();}});}}

    5.2收入明细界面

package com.example.tallybook.activity;import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;import com.example.tallybook.R;
import com.example.tallybook.adapter.IncomeAdapter;
import com.example.tallybook.bean.IncomeBean;
import com.example.tallybook.db.MyDBHelper;import java.util.ArrayList;
import java.util.List;public class InComeDetailActivity extends AppCompatActivity {RecyclerView recy_view;MyDBHelper mhelper;SQLiteDatabase db;List<IncomeBean> arr1 = new ArrayList();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_in_come_detail);initView();initData();IncomeAdapter adapter = new IncomeAdapter(InComeDetailActivity.this,arr1);StaggeredGridLayoutManager st = new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);recy_view.setLayoutManager(st);recy_view.setAdapter(adapter);}private void initView(){recy_view = findViewById(R.id.recy_view_indetail);mhelper = new MyDBHelper(InComeDetailActivity.this);db = mhelper.getWritableDatabase();}private void initData(){Cursor cursor = db.rawQuery("select * from in_come",null);while (cursor.moveToNext()){@SuppressLint("Range") int myid = cursor.getInt(cursor.getColumnIndex("id"));@SuppressLint("Range") double mymoney = cursor.getDouble(cursor.getColumnIndex("inmoney"));@SuppressLint("Range") String mytime = cursor.getString(cursor.getColumnIndex("intime"));@SuppressLint("Range") String mytype = cursor.getString(cursor.getColumnIndex("intype"));@SuppressLint("Range") String mypayer = cursor.getString(cursor.getColumnIndex("inpayer"));@SuppressLint("Range") String myremark = cursor.getString(cursor.getColumnIndex("inremark"));IncomeBean incomeBean = new IncomeBean(myid,mymoney,mytime,mytype,mypayer,myremark);arr1.add(incomeBean);}}
}

    5.3数据库

package com.example.tallybook.db;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;import com.example.tallybook.R;
import com.example.tallybook.activity.NewInComeActivity;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);}@Overridepublic void onCreate(SQLiteDatabase db) {//用户表db.execSQL("create table tb_userinfo(id integer primary key autoincrement,name varchar(10),pwd varchar(15))");//收入表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),outpayer varchar(100),outpayee varchar(100),outremark varchar(500))");}@Overridepublic void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){}}

这篇关于Android Studio开发项目——记账簿应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802745

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#