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

2)系统架构分析
记事本界面包含内容列表和添加按钮。
1、当长按列表条目(Item)时,会弹出一个提示是否删除Item的对话框,当点击对话框中的确定按钮时,删除Item,当点击对话框中的取消按钮时,取消删除Item。
2、当点击记事本界面列表中的Item时,会跳转到修改记录界面,该界面可以查看和修改记录。
3、当点击记事本界面中的添加按钮时,会跳转到添加记录界面,该界面可以添加记录内容。
记事本应用架构图
3)数据库类设计分析

数据库设计是项目中开发中非常关键的一个关节,在记事本应用中,我们通过数据库(Note)存储和读取数据。


4)界面需求分析
界面在移动开发平台开发中非常重要,也是用户使用软件的先决条件。记事本应用分为3个界面,分别为记事本界面、添加记录界面和修改记录界面。

①记事本界面:该界面包含添加按钮和记录列表,点击记事本界面中的添加按钮时,程序会跳转到添加记录界面。当点击记事本界面列表中的Item时,程序会跳转到修改记录界面。


②添加记录界面:该界面能添加需要记录的内容和清除和保存编辑的内容。

③修改记录界面:该界面能够查看和修改已保存的记录内容、清除和保存编辑的内容。

2、开发环境介绍

操作系统:Windows 10系统开发工具:JDK11,Android3.5.3API版本:Android API 27

3、记事本功能业务实现

1)搭建聊天布局界面---activity_notepad.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context=".MainActivity"android:background="#fefefe"><TextViewandroid:id="@+id/note_name"android:layout_width="match_parent"android:layout_height="45dp"android:textSize="20sp"android:textColor="@android:color/white"android:gravity="center"android:textStyle="bold"android:background="#fb7a6a"android:text="记事本"/><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"android:cacheColorHint="#00000000"android:divider="#E4E4E4"android:dividerHeight="1dp"android:fadingEdge="none"android:listSelector="#00000000"android:scrollbars="none"android:layout_below="@+id/note_name"/><ImageViewandroid:id="@+id/add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/add"android:layout_marginBottom="30dp"android:layout_centerHorizontal="true"android:layout_alignParentBottom="true"/>
</RelativeLayout>

注意:修改清单文件


2)搭建记事本界面Item布局----notepad_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingLeft="12dp"><TextViewandroid:id="@+id/item_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:maxLines="2"android:ellipsize="end"android:lineSpacingExtra="3dp"android:paddingTop="10dp"android:textColor="@android:color/black" /><TextViewandroid:id="@+id/item_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#fb7a6a"android:paddingTop="5dp"android:paddingBottom="7dp"/>
</LinearLayout>

3)封装记录信息实体类----创建NotepadBean类

package com.example.notepad;
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;}
}

4)编写记事本列表适配器----创建NotepadAdapter类

package com.example.notepad;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class NotepadAdapter extends BaseAdapter {private LayoutInflater layoutInflater;private List<NotepadBean> list;public NotepadAdapter(Context context ,List<NotepadBean>list) {this.layoutInflater = LayoutInflater.from(context);this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}
//重写getView()方法,该方法主要通过inflate()方法加载Item界面的布局文件,并将获取的数据显示到对应的控件上。@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;//判断convertView是否为null,如果为null,则创建一个ViewHolder对象,接着tgsetTag()方法将该对象添加到convertView中进行缓存,否则,将通过getTag()方法获取缓存的ViewHolder对象if(convertView==null){convertView = layoutInflater.inflate(R.layout.notepad_item,null);viewHolder = new ViewHolder(convertView);convertView.setTag(viewHolder);}else{viewHolder = (ViewHolder)convertView.getTag();}NotepadBean noteInfo = (NotepadBean)getItem(position);viewHolder.tvNotepadContent.setText(noteInfo.getNotepadContent());viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime());return convertView;}class ViewHolder{TextView tvNotepadContent;TextView tvNotepadTime;public ViewHolder(View view) {tvNotepadContent = (TextView)view.findViewById(R.id.item_content);tvNotepadTime = (TextView)view.findViewById(R.id.item_time);}}
}

5)创建数据库----数据库的工具类DBUtils与类SQLiteHelper
数据库的工具类DBUtils

package com.example.notepad;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DBUtils {public static final String DATABASE_NAME = "Notepad";    //数据库名public static final String DATABASE_TABLE = "Note";    //表名public static final int DATABASE_VERSION = 1;    //数据库版本//数据库表中的列名public static final String NOTEPAD_ID = "id";public static final String NOTEPAD_CONTENT= "content";public static final String NOTEPAD_TIME = "notetime";public static final String getTime(){//获取当前日期SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date date = new Date(System.currentTimeMillis());return simpleDateFormat.format(date);}
}

类SQLiteHelper

package com.example.notepad;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
public class SQLiteHelper extends SQLiteOpenHelper {private SQLiteDatabase sqLiteDatabase;//创建数据库public SQLiteHelper(Context context) {//通过super()方法创建了一个名为Notepad的数据库super(context, DBUtils.DATABASE_NAME, null, DBUtils.DATABASE_VERSION);sqLiteDatabase = this.getWritableDatabase();}
//创建表@Overridepublic 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)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}//增加数据public boolean insertDate(String userContent,String userTime){ContentValues values = new ContentValues();values.put(DBUtils.NOTEPAD_CONTENT,userContent);values.put(DBUtils.NOTEPAD_TIME,userTime);return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,values) > 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 updateDate(String id,String content,String userTime){ContentValues values = new ContentValues();values.put(DBUtils.NOTEPAD_CONTENT,content);values.put(DBUtils.NOTEPAD_TIME,userTime);String sql = DBUtils.NOTEPAD_ID+"=?";String[] strings = new String[]{id};return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,values,sql,strings) > 0 ;}//查询数据public List<NotepadBean> query(){List<NotepadBean> list = new ArrayList<>();Cursor cursor = sqLiteDatabase.query(DBUtils.DATABASE_TABLE, null, null, null, null, null, null);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;}
}

6)实现记事本界面的显示功能----显示列表、添加列表
NotepadActivity类

package com.example.notepad;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class RecordActivity extends AppCompatActivity implements View.OnClickListener{ImageView noteback;TextView note_time;EditText content;ImageView delete;ImageView note_save;SQLiteHelper mSQLiteHelper;TextView noteName;String id;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_record);noteback = (ImageView)findViewById(R.id.note_back);note_time = (TextView)findViewById(R.id.tv_time);content = (EditText)findViewById(R.id.note_content);delete = (ImageView) findViewById(R.id.delete);note_save = (ImageView) findViewById(R.id.note_save);noteName = (TextView) findViewById(R.id.note_name);noteback.setOnClickListener(this);delete.setOnClickListener(this);note_save.setOnClickListener(this);initData();}protected void initData() {mSQLiteHelper = new SQLiteHelper(this);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);}else{noteName.setText("添加记录");}}}@Overridepublic 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.updateDate(id,noteContent,DBUtils.getTime())){Toast.makeText(RecordActivity.this,"修改成功",Toast.LENGTH_LONG).show();setResult(2);finish();}else{Toast.makeText(RecordActivity.this,"修改失败",Toast.LENGTH_LONG).show();}}else{Toast.makeText(RecordActivity.this,"内容不能为空",Toast.LENGTH_LONG).show();}}else{//增加if(noteContent.length()>0){if(mSQLiteHelper.insertDate(noteContent,DBUtils.getTime())){Toast.makeText(RecordActivity.this,"保存成功",Toast.LENGTH_LONG).show();setResult(2);finish();}else{Toast.makeText(RecordActivity.this,"保存失败",Toast.LENGTH_LONG).show();}}else{Toast.makeText(RecordActivity.this,"内容不能为空",Toast.LENGTH_LONG).show();}}break;}
​}
}

Android项目之记事本相关推荐

  1. android项目 之 记事本(6)----- 加入手写

    想必大家都用过QQ的白板功能,里面主要有两项,一个是涂鸦功能,事实上类似于上节的画板功能,而还有一个就是手写,那记事本怎么能没有这个功能呢,今天就来为我们的记事本加入手写功能. 先上图,看看效果: 看 ...

  2. android记事本 图文存储,android项目 之 记事本(15) ----- 保存手写及绘图

    之前,忘了写如何将手写和绘图保存,现在补上. 首先看如何保存绘图,先看效果图: 因为记事本的绘图功能主要用到了画布,而在构建画布时,指定了Bitmap,也就是说在画布上的所画的东西都被保存在了Bitm ...

  3. Android Studio实现记事本项目

    项目目录 一.需求分析 1.业务需求分析 2.架构分析 3.数据库类设计分析 4.界面需求分析 4.1.记事本界面 4.2.添加记录界面 4.3.修改记录界面 二.开发环境介绍 三.记事本功能业务实现 ...

  4. 基于Android平台的记事本软件(Android Studio项目+报告+app文件)

    移动应用开发技术 期末考核报告 题   目:        基于Android平台的记事本软件             学生姓名     学生学号                           ...

  5. 使用Roboguice依赖注入规划Android项目

    2019独角兽企业重金招聘Python工程师标准>>> 前言 好久没写博客了,罪过啊-记事本里累积了不少东西,整理整理放上来. 关于依赖注入 Dependency Injection ...

  6. Android项目和Android教程总结(史诗级宝典)

    博主一年前发布了一些Android项目和教程,当时就是想分享给大家,帮助大家解决遇到的难题,少走弯路.经常看到评论下有同学说博主很细心.讲的很详细,还有很良心免费分享源码,博主很欣慰得到大家的肯定和支 ...

  7. 如何导入gradle版本不同的Android项目

    博主发过很多Android项目,很多同学都在评论说道导入之后运行不起来或者报错,这是因为我的项目版本和你Android的gradle版本不一致,这里给大家介绍如何按照自己gradle版本导入我的And ...

  8. (转载) android项目大全,总有你所需的

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...

  9. android 项目大全,总有你所需的

    android项目大全,总有你所需的 目录(?)[+] 注:打开请贴网址,有些直接通过链接打开的不正确. 1.相对布局实例 http://kukuqiu.iteye.com/blog/1018396 ...

最新文章

  1. 0x02 mysql 表格相关操作
  2. 2.1.5 编码与调制
  3. 您如何计算字符串中字符串(实际上是字符)的出现?
  4. Postgres数据库备份与还原命令
  5. easypoi needmerge失效_EasyPOI简单用例,简单有效
  6. eax, ebx, ecx, edx, esi, edi, ebp, esp 各寄存器作用
  7. @贾跃亭,证监会喊你本周回国对乐视负责!
  8. hdu 2234(IDA*)
  9. 8音度dsp调音教程_以速腾为例,对比加高品质DSP功放前后音响效果
  10. 斗鱼 Juno 监控中心的设计与实现
  11. 大数据分析项目生命周期
  12. 数仓建模—ID Mapping(下)
  13. 中国古代称谓专有名词
  14. 【影评】海贼王:855
  15. db2 dec函数oracle,DB2常用函数与Oracle有什么区别?
  16. tensorflow2.0 基于LSTM模型的文本生成
  17. 07 HSV和HSL和YUV
  18. python html5游戏_25 个超棒的 HTML5 JavaScript 游戏引擎开发库
  19. 俞敏洪在同济大学的惊天动地的演讲
  20. 需要多久才能看完linux内核源码?

热门文章

  1. 美丽即可用抑或可用即美丽?
  2. html5设计制作作品,16个精美的 HTML5 作品集网站设计案例
  3. 【IEEE/ACM专区】一篇高质量的IEEE/ACM Transaction论文是如何顺利发表的?
  4. my ReadFood_Nanking Delicious / food / delicious
  5. SPARQL查询语句
  6. Pi-puck的ROS开发之路
  7. 教程get | K8S部署OpenStack容器云(下)
  8. python自学笔记
  9. win10误删的注册表能还原吗_win10系统误删注册表怎么办|win10系统误删注册表的恢复方法...
  10. java百度身份证识别