基于Android平台的记事本软件(Android Studio项目+报告+app文件)
移动应用开发技术
期末考核报告
题 目: 基于Android平台的记事本软件
学生姓名
学生学号
专 业
班 级
指导教师
2022 年 06 月 20 日
目录
1. 项目来源及背景... 4
2. 需求分析... 4
2.1 记事功能需求分析:... 4
2.1.1 显示记事... 4
2.1.2 添加记事... 4
2.1.3 编辑记事... 5
2.2 账户管理... 5
2.2.1 注册账号... 5
2.2.2 登录... 5
2.2.3 修改密码... 5
2.2.4 注销账号... 5
2.3 数据库需求分析... 6
2.4 界面需求分析... 6
3. 系统总体设计... 7
3.1账户管理... 7
3.1.1登录... 7
3.1.2 注册... 8
3.1.3 修改密码... 9
3.1.4 注销... 10
3.2 记事功能... 11
4. 详细设计与实现... 12
4.1 记事相关功能... 12
4.1.1 显示记事... 12
4.1.2 添加记事... 14
4.1.3 编辑记事... 15
4.1.4 账户管理... 18
4.2 数据库... 21
4.3 背景音乐... 21
4.4 界面美化... 22
4.5其他细节... 23
5. 总结与体会... 23
参考文献... 24
2.1 记事功能需求分析:
2.1.1 显示记事
用户打开记事本一定要能够看到之前的写的记事内容,所以进入主页面后,软件应该从数据库中搜索出该用户所写的全部记事,并按照一定顺序排列输出。
2.1.2 添加记事
设置添加记事内容入口,用户点击后进入,开始编辑记事的标题和内容。
2.1.3 编辑记事
在主界面的记事列表中。点击一条记事,能够进行编辑,包括更改记事(更新)和删除记事。
2.2 账户管理
为了更好的保护客户的隐私要求,也为了能让同一台手机的不同用户能够使用该软件,软件有专门的账户管理。
记事本供本机中多名用户使用,设计账户管理可以让多个用户使用该软件,且保证每个人只能看到自己的记事内容。这就相当于是一把锁。
2.2.1 注册账号
注册账号是要对密码进行确认,防止用户填写密码时填写错误,而导致该账号虽然注册了,但是密码相当于遗忘了,相当于账号刚注销变报废。当然,账号和密码都不能为空。
2.2.2 登录
登录时对账号密码进行检验,包括是否为空,账号密码是否正确。根据不同错误,对用户进行提示。
为了让用户不用每次登录都要输入账号密码,要增加记住密码选项。(记住密码也有不足之处,如果其他用户使用该机中的此软件,那他就可以直接登录)
2.2.3 修改密码
修改密码时,要输入账号、旧密码、新密码并确认新密码,四项缺一不可,任何一项为空,都要对用户进行提示。四项填写完成用户确认后,进行账号密码比对,验证成功再进行新密码的确认,最后更换密码。
2.2.4 注销账号
用户不想再使用该软件后,可以主要注销账户。注销账户要同时删除数据库中该用户的记事数据。
2.3 数据库需求分析
软件主要分为两大模块(登录和记事),所以需要创建两个表,分别为用户表和记事表
2.4 界面需求分析
- 系统总体设计
3.1账户管理
3.1.1登录
3.1.2 注册
3.1.3 修改密码
3.1.4 注销
3.2 记事功能
- 详细设计与实现
4.1 记事相关功能
4.1.1 显示记事
登录后主界面为Listview组件展示的记事列表,该组件显示用户的所有记事数据,每一条记事数据展示在item上的只是该条记事数据中的标题和最新编辑时间。
记事列表显示以最新编辑时间递减显示,这样可以让用户最新添加和编辑的记事排在最前面,更加人性便捷。
由于记事本界面的记事列表是使用ListView控件展示的,因此需要创建一个数据适配器对ListView控件进行数据适配,具体步骤如下:
- 创建MemoAdapter类
创建一个MemoAdapter类继承自BaseAdapter类。
- 创建Holder类
在MemoAdapter类中创建一个Holder类来初始化ltem界面中的控件。
BaseAdapter是一款是最万能最好用的数据适配器之一,BaseAdapter的
View getView(final int position, View convertView, ViewGroup parent) 填充每个item的可视内容并返回。getView方法是由系统自动回调的方法,每当可视区域内需要刷新一个item时就会被调用,用来填充item内容、绑定事件等其他操作。因此,对ListView内容的数据填充都在这个方法中实现。
在Holder类中,只有两个TextView参数,text和textTime,分别代表一个记事的标题和最新的编辑时间。
第一次调用getView方法时convertView都为null,因此刚进入主页面是,会对布局实例化:
convertView = LayoutInflater.from(context).inflate(R.layout.list_member, null);
View.inflate作用是将layout_item转换成View对象。界面中ListView能显示多少个item,getView就要被调用多少次。
getView中实例化一个Holder对象holder,holder中的参数分别用显示界面中对应的TextView实例化,这相当于holder绑定了界面中的两个组件。
用convertView.setTag(hodler), 将holder数据存储在convertView中。
如果convertView实例化,那么直接用getTag取出其中的holder数据,此时holder绑定了界面中的两个组件。
View中的setTag()表示给View添加一个格外的数据,可以用getTag()将这个数据取出来。
之后便是用游标将数据中的对应的数据(标题和最新编辑时间)取出来,再复制给holder中的两个对应的成员(现在是xml中的TextView组件)。这样就将数据显示出来了。
详细代码见源程序。
4.1.2 添加记事
添加记事,只要将组件中的String内容取出,再放入数据库中就可以了。
数据操作语句:database.insert(sqliteHelper.tableName, null, values);
向数据库中插入记事数据时,要在也要插入用户名,以便显示记事数据时,能精准查询到具体某个用户所写的记事。这就要求从登录后,用户名要在各个Activity之间传递,只需要用Intent传递就可以了。
- 编辑记事
编辑包括删除和修改(更新)。
删除根据该条记事数据的id删除,id为每条记事数据的自增列,也是主键。delete(sqliteHelper.tableName, sqliteHelper.id + "=" + pos, null);
为了避免误删除,设置提示:
- AlertDialog.Builder builder = new AlertDialog.Builder(OneMemoActivity.this);
- builder.setMessage("你确定要删除吗?")
- .setTitle("提示")
- .setPositiveButton("确定",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- deleteByPos();
- dialog.dismiss();
- finish();
- }
- })
- .setNegativeButton("不,刚才我手滑了",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .show();
效果如下图:
用户点击编辑按钮,进入编辑界面,进行记事的修改,修改后点确认就完成修改。修改就和添加记事的操作一致了。见下图:
4.1.4 账户管理
1) 注册、修改密码、注销
注册、密码修改和注销实大同小异。不同的是注销是,也要在数据库中删除注销用户的记事数据。
delete(sqliteHelper.tableName, sqliteHelper.user + "=" + userName, null);
从左到右分别为注册、修改密码、注销
- 登录
登录实际上主要涉及的是账户密码的验证,这只需要用数据库语句从数据库中查询是否有该用户名和密码的一致的数据就可以了。
这里的新颖之处在于账号记住密码:
为了让用户不用每次登录都要输入账号密码,要增加记住密码选项。(记住密码也有不足之处,如果其他用户使用该机中的此软件,那他就可以直接登录)
4.2 数据库
软件主要分为两大模块(登录和记事),所以需要创建两个表,分别为用户表和记事表
字段名 |
数据类型 |
是否为主键 |
描述 |
id |
integer |
是 |
编号 |
datas |
text |
否 |
记事内容 |
user |
text |
否 |
用户名 |
lastModifyTime |
text |
否 |
最新编辑时间 |
title |
text |
否 |
记事标题 |
字段名 |
数据类型 |
是否为主键 |
描述 |
_id |
integer |
是 |
编号 |
user_name |
text |
否 |
用户名 |
user_pwd |
text |
否 |
密码 |
项目中MemoSQLiteOpenHelper类继承于SQLiteOpenHelper,用于创建记事本数据库数据表。UserDataManager类是数据操作管理类,数据库数据表的创建,数据的增删改查代码都在这里。
4.3 背景音乐
背景音乐的添加也是很简单的,这和实验中做过的代码一样,需要注意的是,Service需要在AndroidManifest.xml中经行注册。用编译软件快捷添加的Service实际上会自动进行注册。
Service在主显示Activity(MainActivity)启动时开始运行,在该Activity销毁时,同时也把改Service也进行销毁。这样用户登录成功后,背景音乐便会想起。
注:此程序的默认Activity是LoginActivity,因为用户进入软件必须要进行登录。修改默认Activity在AndroidManifest.xml进行。
背景音乐存放在res/raw文件夹下。
4.4 界面美化
为了让软件更加美观,对软件图标进行了设置,软件中的界面也添加了一些图标、图片,添加记事的按钮采用悬浮按钮,按钮中也添加了图片。
悬浮按钮:
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/add"
android:layout_gravity="right|bottom"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:src="@drawable/add"
app:borderWidth="0dp"
app:fabSize="auto"
app:maxImageSize="56dp"
app:backgroundTint="#99ccff"
app:rippleColor="#33728dff"
app:elevation="8dp"
app:pressedTranslationZ="16dp"/>
<!-- app:maxImageSize 设置图片大小 -
从左到右分别为APP图标、登录界面logo、主界面悬浮按钮(添加记事按钮)
4.5其他细节
音乐文件存放在res/raw文件夹下,本软件的背景音乐是Promise.mp3,是寂静岭的一首刺激人积极向上,鼓舞人心的一首歌曲。
项目中的图片文件放在res/drawable文件下,想要跟换软件图标,还需要在AndroidManifest.xml中对android:icon="@drawable/applogo"语句进行更改。实际发现还需要将图标文件放入res/mipmap文件夹下,否则无法更变图标。
项目中的图片是从网页上下载的png图片,用户名和密码图标是Android Studio 项目自带的。
程序中尽量不要出现中文,所以可以将中文都放在 res/values文件夹下的strings.xml文件中。
<string name="login">登录</string>
想要用登录这个词可以用getString(R.string. login)。
在strings.xml还能动态的插入内容
<string name="user_login_success">用户:<xliff:g example="tom" id="id2">%1$s</xliff:g>登录,欢迎光临!</string>
使用语句getString(R.string.name_already_exist, “YTJ”)就可以让表示用户YTJ登录,欢迎光临!
其中:
属性id可以随便命名
属性example表示举例说明,可以省略
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
本次大作业有挺多数据库的相关操作,而我的主要卡壳点就是数据库的使用。在查询特定条件的数据时,花了些许时间。比如查询数据库中是否有用户名为user的用户时,可以使用
String sql="select * from " + TABLE_NAME + "where " + USER_NAME + "= '" + userName+ "'";
SQLiteDatabase.rawQuery(sql, null)
SQLiteDatabase .query(TABLE_NAME, null, USER_NAME+"="+userName, null, null, null, null);
SQLiteDatabase.query(TABLE_NAME, null, USER_NAME + "=?", new String[] { user}, null, null, null);
刚开始使用了前两种,但是显示查不到数据,网上看了很多相关问题怎么都发现不了问题出在哪里,最后才找到第三种方式,成功查找到数据。
ListView的数据显示方式用的和书上有所不同,采用的网络上大部分人使用的BaseAdapter适配器,经过学习掌握,也算是一大收获。
[1] 郭霖 第一行代码—Android (第2版) [M].人民邮电出版社 2016.11
[2] 黄晓先 基于Android的掌上校园交流系统设计与实现[J]. 开封教育学院学报,2016,03:280-281.
[4] 张生财 基于Android教务信息管理系统开发[J]. 科技创新与应用,2014,34:72.
[5] 杨云君 Android 的设计与实现[M]. 北京:机械工业出版社,2013:45-49.
[6] 关于BaseAdapter中getView方法的理解与实现_酷酷咔汽的博客-CSDN博客_getview作用.
基于Android平台的记事本软件(Android Studio项目+报告+app文件)相关推荐
- 基于android记事本论文,基于android平台的记事本研究与开发 开题报告
武汉理工大学本科学生毕业设计 (论文)开题报告 1.目的及意义(含国内外的研究现状分析) 这次课题的目的是在Android系统的手机开发平台之上,研究与开发一个记事本软件,提供适用手机的记事本功能服务 ...
- 基于android平台语音日程软件的设计与实现,基于Android平台语音日程软件的设计与实现...
摘要: 随着移动互联网的发展,智能手机已成为最重要的终端设备,由此产生了以Android平台为代表的新一代操作系统,基于该平台的分布式应用成为移动通信技术领域的研究热点.由于基于Android手机桌面 ...
- 基于eclipse开发Android天气,基于android平台的天气预报软件的设计与实现.doc
基于android平台的天气预报软件的设计与实现 摘 要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此手机的娱乐应用服务将会有很大的发展空间手机快捷查询软件就是其中的一项. ...
- android社交软件。平台,基于Android平台的社交软件设计及实现.pdf
24 7 计算机技术与发展 Vol. 24 No. 7 第 卷 第 期 2014 7 July 2014 年 月 COMPUTER TECHNOLOGY AND DEVELOPMENT 基于Andro ...
- Android平台开发指导(Android Porting Guide)
本文为Android平台开发人员和Android设备制造商提供了底层开发指导.如果你对Android的上层应用开发很感兴趣,请访问Android Developers Site. 关于这份指导书 这份 ...
- java imgui,发布使用 IMGui 基于 msys2 平台编写的软件
发布使用 IMGui 基于 msys2 平台编写的软件 最近空闲时间为项目编写一个协议测试工具.由于习惯使用 gcc/g++ 所以在 Windows 10 操作系统上选择 msys2 开发.编程语言是 ...
- 基于jsp的影视创作论坛系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
摘要: 本文基于JSP技术,设计并实现了一个基于JSP的影视创作论坛系统.该系统旨在提供一个在线平台,供影视创作者交流.展示作品和分享经验.系统具备用户注册.登录.发表文章.评论.上传作品等功能,以满 ...
- 基于android平台的出题软件---- 每日30题
本app共编写了3个activity,1.Mainactivity作为主界面.2.surface,用来显示随机出的题.3.showresult,用来打印所有做过的题(含结果),一个类function用 ...
- 美观靓丽 Android平台四大桌面软件横评
腾讯数码讯(飘渺) 近年来,谷歌android手机系统的流行,吸引越来越多的软件开发者加入Android软件的开发.手机桌面作为人与机最常用的对话界面,也是用户个性最直接的展示,今天,我们就GO桌面. ...
最新文章
- WIN7下黑苹果懒人版硬盘安装not a HFS partition注意问题
- 取消Exchange数据库的自动分配功能
- 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】
- esp32-wrover流水灯c语言程序,ESP-WROVER-KIT V4.1 入门指南
- css中小知识点总结
- Java主线程等待子线程、线程池
- pycharm上传代码到github
- java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...
- C++控制向文件中写入浮点数的格式
- Java System类exit()方法及示例
- python导入鸢尾花数据集_Python实现鸢尾花数据集分类问题——基于skearn的SVM
- PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
- 2018年大学生创业项目推荐
- 动态规划dp算法经典包子凑数java
- pnuts系统的局限性_水平系统的局限性
- 组成原理 - 内存颗粒分类(ram,rom)
- Shader实现透明反射效果应用地板
- 命名时取代基优先顺序_烷烃的系统命名
- 如何理解反步法设计控制器?
- 『 文件操作 』文件批量改名
热门文章
- Threejs在vue中使用(场景、相机、渲染器、gltf模型添加、环境贴图等)
- jquery点击div跳转页面
- 小米5 android studio,Android应用开发android studio运行app,使用模拟器可以,用小米5手机安装失败...
- 人力资源开发与管理学习笔记
- 【二】2D测量 Metrology——apply_metrology_model()算子
- ASP.NET二手中介房源信息管理系统源码
- 安卓碎片(Fragment)的使用
- 课堂讨论:软件改变世界
- Debian安装PostgreSQL
- 更新DOTA2显示无法连接到更新服务器,Dota2国服不能更新出现错误的解决办法