Android手机开发课程设计之记事本

article/2025/8/5 6:34:54

一、需求分析

1.1业务需求分析

近年来,随着生活节奏的加快,工作和生活的双重压力全面侵袭着人们,如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本,其能够便携记录生活和工作对诸多事情,从而帮助人们有效地进行时间管理。

1.2功能需求分析

本记事本项目希望可以开发出一款符合用户生活工作习惯的简单应用,能够满足用户的各方面需求,可以对记事进行增加、查看、修改和删除,要求功能完善丰富并且具有良好的用户界面和交互体验。

二、项目设计

2.1功能模块设计

2.1.1记事本基本操作

记事本基本操作是该项目的核心部分,提供添加、查看、修改、删除记事本信息的功能,提供记事本动态更新的功能。

2.1.2 记事本主界面列表展示

用户可能需要创建许多记事事项,并且需要对这些记录事项进程基本操作,记事本的列表展示能使用户界面更加简洁清晰,且给用户带来使用方便。

2.1.3 记事本数据存储

记事本最重要功能即记录和保存用户易遗忘的日期和事件,为了持久地将用户记录事项信息保存下来,需要将这些信息存储到数据库中,记事本需要保存的信息字段有编号、事件内容和保存事件的具体时间。
其功能模块图如图所示。
在这里插入图片描述

2.2数据库设计

由上面的功能模块分析可知,本记事本项目的数据库设计主要包括三个字段名:编号id、事件内容content和保存事件的时间notetime,其数据库表如下表所示:
在这里插入图片描述

2.3界面设计

2.3.1记事本主界面

该界面主要包括添加按钮和记录事项列表。记事本主界面设计如下图所示。
在这里插入图片描述

2.3.2 添加记录事项界面

该界面主要包括清除内容和保存内容按钮以及文本编辑。记事本添加记录事项如下图所示。
在这里插入图片描述

三、项目实现

3.1 NotepadBean类

由于记事本中的每个记录都会有其唯一的编号id、记录内容notepadContent和保存记录的时间notepadTime属性,因此我们需要创建一个NotepadBean类用于存放这些属性,并实现其相应的getter和setter方法,其主要代码如下:

public class NotepadBean {private String id;//记录编号private String notepadContent;//记录的内容private String notepadTime;//保存记录的时间public String getId() {return id;}public void setId(String id) {this.id = id;}public String getNotepadContent() {return notepadContent;}public void setNotepadContent(String notepadContent) {this.notepadContent = notepadContent;}public String getNotepadTime() {return notepadTime;}public void setNotepadTime(String notepadTime) {this.notepadTime = notepadTime;}

}

3.2 NotepadAdapter类

由于记事本界面的记录列表是使用ListView控件展示,因此需要创建一个数据适配器NotepadAdapter类对ListView控件进行数据适配,我们可以先创建NotepadAdapter类,再在NotepadAdapter类中创建一个ViewHolder类初始化Item界面中的控件,其中主要代码如下:

public View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView==null){//加载Item界面对应的布局文件convertView=layoutInflater.inflate(R.layout.notepad_item,null);viewHolder=new ViewHolder(convertView);//创建ViewHolder对象convertView.setTag(viewHolder);//创建ViewHolder对象}else {viewHolder=(ViewHolder) convertView.getTag();//convertView关联ViewHolder对象}NotepadBean notepadBean=(NotepadBean)getItem(position);//将获取的数据显示到对应的控件上viewHolder.tvNotepadContent.setText(notepadBean.getNotepadContent());viewHolder.tvNotepadTime.setText(notepadBean.getNotepadTime());return convertView;
}
class ViewHolder{TextView tvNotepadContent;TextView tvNotepadTime;public ViewHolder(View view){tvNotepadContent=view.findViewById(R.id.item_content);//记录的内容tvNotepadTime=view.findViewById(R.id.item_time);//保存记录的时间}
}

3.3 SQLiteHelper类

在记事本程序中存储和读取记录的数据都是通过操作数据库完成的,我们需要创建SQLiteHelper类实现对数据库中表的增删改查,以及利用数据库中的工具类DBUtils来定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,其主要代码如下:
创建数据库:

public SQLiteHelper(Context context){super(context, DBUtils.DATABASE_NAME,null,DBUtils.DATABASE_VERION);sqLiteDatabase=this.getWritableDatabase();
}

创建表:

@Override
public void onCreate(SQLiteDatabase db){db.execSQL("CREATE TABLE "+DBUtils.DATABASE_TABLE+"("+DBUtils.NOTEPAD_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+DBUtils.NOTEPAD_CONTENT+" text, "+DBUtils.NOTEPAD_TIME+" text)");
}

添加数据:

public boolean insertData(String userContent,String userTime){ContentValues contentValues=new ContentValues();contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);contentValues.put(DBUtils.NOTEPAD_TIME,userTime);return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0;
}

删除数据:

public boolean deleteData(String id){String sql=DBUtils.NOTEPAD_ID+"=?";String[] contentValuesArray=new String[]{String.valueOf(id)};return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0;
}

修改数据:

public boolean updateData(String id,String content,String userYear){ContentValues contentValues=new ContentValues();contentValues.put(DBUtils.NOTEPAD_CONTENT,content);contentValues.put(DBUtils.NOTEPAD_TIME,userYear);String sql=DBUtils.NOTEPAD_ID+"=?";String[] strings=new String[]{id};return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0;
}

查询数据:

public List<NotepadBean> query(){List<NotepadBean>list=new ArrayList<NotepadBean>();Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,null,null,null,DBUtils.NOTEPAD_ID+" desc");if (cursor!=null){while (cursor.moveToNext()){NotepadBean noteInfo=new NotepadBean();String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));noteInfo.setId(id);noteInfo.setNotepadContent(content);noteInfo.setNotepadTime(time);list.add(noteInfo);}cursor.close();}return list;
}

3.4 NotepadActivity类

记事本主界面包含显示列表和添加按钮功能,我们创建NotepadActivity类实现,其中显示列表在NotepadActivity类中通过创建showQueryData()方法,在该方法中查询数据库存放的记录信息,并将该信息显示到记录列表中,其实现代码如下:

private void showQueryData(){if(list!=null){list.clear();}list=mSQLiteHelper.query();adapter=new NotepadAdapter(this,list);listView.setAdapter(adapter);
}
为“添加按钮”通过setOnClickListener()方法设置点击事件,当点击该按钮时,跳转到添加记录的界面,其实现代码如下:
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView=findViewById(R.id.listview);ImageView imageView=findViewById(R.id.add);initData();imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);startActivityForResult(intent,1);}});
}

3.5 RecordActivity类

RecordActivity为修改记录,我们在NotepadActivity中通过listView的setOnItemClickListener()方法监听Item的点击事件,携带被点击Item的记录内容跳转到RecordActivity中,其会根据获取的数据显示记录的内容。另外当我们需要删除记事本列表中的记录时,需要长按列表中的Item,此时会弹出一个对话框提示是否删除Item对应的事件。setOnItemClickListener()方法代码如下:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?>parent,View view,int position,long id ){NotepadBean notepadBean=list.get(position);Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);intent.putExtra("id",notepadBean.getId());intent.putExtra("content",notepadBean.getNotepadContent());intent.putExtra("time",notepadBean.getNotepadTime());NotepadActivity.this.startActivityForResult(intent,1);}});listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {AlertDialog dialog;AlertDialog.Builder builder=new AlertDialog.Builder(NotepadActivity.this).setMessage("是否删除此记录?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {NotepadBean notepadBean=list.get(position);if(mSQLiteHelper.deleteData(notepadBean.getId())){list.remove(position);//删除对应的Itemadapter.notifyDataSetChanged();//更新记事本页面Toast.makeText(NotepadActivity.this,"删除成功",Toast.LENGTH_LONG).show();}}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});dialog=builder.create();dialog.show();return true;}
});

RecordActivity利用initData()函数接收传递的数据去,其代码如下:

public void initData(){mSQLiteHelper=new SQLiteHelper(this);noteName.setText("添加记录");Intent intent=getIntent();if(intent!=null){id=intent.getStringExtra("id");if(id!=null){noteName.setText("修改记录");content.setText(intent.getStringExtra("content"));note_time.setText(intent.getStringExtra("time"));note_time.setVisibility(View.VISIBLE);}}
}

同时,我们在RecordActivity中可以利用switch…case结构实现了编辑记录、保存和清除编辑的记录的功能,即通过EditText控件实现记录的编辑功能,为保存按钮设置点击事件;当点击保存按钮时将记录的内容和保存时间通过SQLiteHelper类的insertData()方法添加到数据库中;为清除按钮设置点击事件,当点击清除按钮时,将EditText控件的内容通过setText()方法置为空字符串。其OnClick()函数代码如下:

public void onClick(View v){switch (v.getId()){case R.id.note_back:finish();break;case R.id.delete:content.setText(" ");break;case R.id.note_save:String noteContent =content.getText().toString().trim();if(id!=null){//修改记录的功能if(noteContent.length()>0){if (mSQLiteHelper.updateData(id,noteContent,DBUtils.getTime())){showToast("修改成功");setResult(2);finish();}else{showToast("修改失败");}} else{showToast("修改的记录内容不能为空");}}else{//添加记录的功能if(noteContent.length()>0){if (mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){showToast("保存成功");setResult(2);finish();}else{showToast("保存失败");}} else{showToast("保存的记录内容不能为空");}}break;}
}

四、项目测试
1、项目运行主界面。
在这里插入图片描述

2、点击主界面添加进入添加页面,输入“Android课程设计”然后点击保存按钮会返回主界面并弹出“保存成功”信息。
在这里插入图片描述

3、长按我们刚刚新建的记录“Android课程设计”会弹出删除对话框,点击确定即可删除,并弹出“删除成功”信息。

在这里插入图片描述

4、选择并打开“20182800”记录,将其修改为“20180000”,然后点击保存按钮,会弹出“修改成功”的信息。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/pWV2uhcX.shtml

相关文章

MATLAB图形绘制--添加图例

添加图例 专业的图像总是附有图例来告诉读者曲线表示什么&#xff0c;下面我们将绘制两个表示势能的函数&#xff0c;他们由双曲三角函数sinh(x)和cosh(x)来定义&#xff0c;X的定义域为0&#xff5e;2&#xff0c;首先我们定义X&#xff1a; >> x [0:0.01:2];然后表示…

matlab 图例自定义,matlab中如何自定义图例_常见问题解析

pd接口是什么口_常见问题解析 pd接口也是“Type-C”的接口&#xff0c;支持扩充协议&#xff0c;可以给手机笔记本充电&#xff0c;也可以传输数据&#xff1b;而“Type-C”中的PD的意思指的是“USB Power Delivery”功率传输协议。 matlab中如何自定义图例&#xff1f;Matlab如…

Matlab 画多个图例( Plot multiple legends )

用matlab 画图时&#xff0c;发现线太多&#xff0c;生成的图例&#xff0c;遮盖了曲线。于是想画成多个图例&#xff0c;然后可以自由拖动。 废话不多说&#xff0c;2&#xff09;代码&#xff08;设置多个图例的部分在最后20行&#xff09;&#xff1b; 1&#xff09;效果。 …

matlab之图例legend的数字变量显示

legend是matlab的图例使用函数&#xff0c;其主要的只用方式为legend(内容1,内容2) 本文主要介绍一下legend如何引用数组的数字表现形式。 例如&#xff0c;若想要画一个滤波器的不同反馈系数的频率响应曲线&#xff0c;在设置条例内容时&#xff0c;需要手动输入反馈系数K的数…

MATLAB图例变成一列变多列的方法

小编在绘制GPS数据图像时&#xff0c;发现图例中元素个数有31个&#xff0c;当采用默认生成图例时&#xff0c;只有一列图例&#xff0c;显示结果如下 图例非常难看&#xff0c;而且占位子&#xff0c;如何让图例从一列变成多列呢&#xff1f; 这里小编给大家提供一个思路&…

matlab把图例放在左边,如何将图例放在p之外

如何将图例放在p之外 我有一系列20个图(不是子图)可以在一个图中制作。 我希望传说能够超越盒子。 与此同时,我不想改变轴,因为图形的大小减少了。 请帮助我以下查询: 我想将情节框保留在情节区域之外。 (我希望传说位于情节区域的右侧)。 无论如何,我减少了图例框内文本的…

matlab之在坐标区上添加图例函数legend

目录 一、功能 二、语法 1.legend(label1,...,labelN) 2.legend(labels) 3.legend(subset,___) 4.legend(target,___) 5.legend(___,Location,lcn) 6.legend(___,Orientation,ornt) 7.legend(___,Name,Value) 8.legend(bkgd) 9.lgd legend(___) 10.legend(v…

Matlab作图后的各种调整方法——线条、坐标、标题、图例

Matlab作图后的各种调整方法——线条、坐标、标题、图例 文章目录 Matlab作图后的各种调整方法——线条、坐标、标题、图例一 &#xff0c; 写在前面1.整个图窗 Figure&#xff08;gcf&#xff09;2.我们使用命令做出的线条 Line&#xff0c;例如plot命令3.坐标轴 Axes (gca) 二…

Matlab图例Legend多行排布、字体格式

适用于图例文字多&#xff0c;简单排布效果差的情形 1. 绘制图形&#xff0c;添加图例 %数据 x[1 2 3 4]; y1[16 2 3 13]; y2[5 11 10 8]; y3[9 7 6 12]; y4[4 14 15 1]; %画图plot(x,y1,r-o); %红色&#xff0c;实线&#xff0c;圆圈 hold on; plot(x,y2,k-d…

在MATLAB中的图例标注及实例说明

1.基本绘图函数 plot(Y)&#xff1a;其中输入参数Y就是Y轴的数据&#xff0c;一般习惯性输入向量 plot(X1,Y1,LineSpec,...,Xn,Yn,LineSpec):LineSpec为选项&#xff08;开关量&#xff09;字符串&#xff0c;用于设置曲线颜色、线型、数据点等&#xff1b;LineSpec的标准设定…

【Matlab】画图时去掉某些图例

1. 什么是legend函数&#xff1f; 在Matlab中&#xff0c;legend函数用于在图形中添加图例&#xff0c;以便更好地理解和解释数据。图例提供了与图形相关的标识&#xff0c;使观察者能够了解图形中不同元素的含义。 legend 函数的语法如下&#xff1a; legend(标签1, 标签2, …

【Matlab】论文各种图例配色Matlab绘制

1. Matlab 绘图 1.1. Plot 函数 x-pi:pi/10:pi; %以pi/10为步长 ytan(sin(x))-sin(tan(x)); %求出各点上的函数值 plot(x,y,--rs,... %绘制红色的虚线&#xff0c;且每个转折点上用正方形表示。LineWidth,2,... % 设置线宽为2Marke…

matlab图例使用技巧

matlab图例使用技巧 1 图形曲线1.1 曲线形状1.2 曲线颜色1.3 曲线粗细1.4 同时改变曲线的形状&#xff0c;粗细&#xff0c;颜色 2 图形字体大小 1 图形曲线 1.1 曲线形状 1.2 曲线颜色 颜色的改变 可以 通过改变R-G-B 的值改变线条的颜色&#xff1a; matlab命令 &#xff1…

如何使用Matlab绘制图形并标记图例

当我们在写cscd、EI或者SCI论文时&#xff0c;常常需要放置一些图片&#xff0c;通常情况下需要对图片进行一些处理&#xff0c;对图像横纵坐标、曲线进行标记。本文阐述如何使用Matlab来实现这些功能。 1、如何使用Matlab绘制相关曲线图 在Matlab中&#xff0c;常采用plot函数…

MATLAB中标注图例

当在一幅图中出现多种图形中&#xff0c;用户可以根据自己的需要&#xff0c;利用legeng命令对不同的图例进行说明。它的使用格式如下&#xff1a; 调用格式 说明 legend(string1,stri…

MATLAB的二维线图绘图函数plot()实例积累

目录 1 plot(Y)2 plot(X,Y)3 plot(___,Name,Value)4 坐标轴标注和图形标题5图例标注6 目前MATLAB的文本已支持Latex公式输入7 控制坐标轴范围 1 plot(Y) plot(Y) 创建 Y 中数据对每个值索引的二维线图。 如果 Y 是向量&#xff0c;x 轴的刻度范围是从 1 至 length(Y)&#xff…

Matlab绘图设置任意位置的图例,多个图例设置

Matlab绘图设置任意位置的图例&#xff0c;多个图例设置 Matlab绘图的图例&#xff0c;可能最普遍的是这种&#xff0c;只有一个图例&#xff0c;竖直方向排列&#xff0c;或者水平方向排列&#xff1a; clc; clear all; close all; t 0:0.001:6; A sin(t); B cos(t); fi…

Matlab 图例 位置的不同命令

Matlab 图例 位置的不同命令 本文是转载的&#xff0c;我怕忘了&#xff0c;所以转载到我的页面来 原文&#xff1a;http://blog.sina.com.cn/s/blog_7db803c10102weyk.html 转载1&#xff1a; https://www.cnblogs.com/xym4869/p/12243271.html Matlab中legend默认的位置在…

用数组的reduce方法实现map方法

what 首先我们需要理解reduce这个方法的语法&#xff1a; arr.reduce(callback,init) //详细写法 arr.reduce((prev,cur,index,arr){... },[])* callback &#xff08;执行数组中每个值的函数&#xff0c;包含四个参数&#xff09;1、previousValue &#xff08;上一次调用回…

map的定义方法

map的定义方法 map的定义方法: map<数据类型&#xff0c;数据类型> 变量名字 举例: map<int,int> mymap; 第一个数据类型是key&#xff0c;是键 第二个数据类型是value&#xff0c;是值 另外map初始值会默认为0的 根据键和值是什么类型的&#xff0c;定义一个map …