写在前面

课程作业需要,于是忙活好几天抄了一个简单的记事本,使用已学内容包括Android UI布局,Activity的跳转,SQLite数据库。

开发环境:Android Studio

源码链接:https://github.com/zsy0216/Notepad


目录

写在前面

一.界面预览

二.基本实现


一.界面预览

  • 主界面

  • 编辑界面

  • 长按删除

二.基本实现

  • 布局实现代码

初始界面功能,最上方标题下为用户创建的各条记录,点击进行修改,长按删除,最下方有添加笔记按钮进行笔记的增加操作。实现的布局文件有初始界面activity_main.xml(里面包含可以以列表的形式展示数据内容的ListView控件)、note_item(ListView对应的item布局,以显示每个条目信息)、note_editor(新建文本编辑界面)、activity_show(文本修改界面)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eaeaea"
android:orientation="vertical"
tools:context=".MainActivity" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Notepad"
android:textSize="20sp"
android:textStyle="bold"
android:background="#efdede"
android:paddingTop="10dp"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:gravity="left">
</TextView> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eaeaea"
android:layout_weight="1">
<ListView
android:id="@+id/lv_note"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
</ListView>
</LinearLayout> <Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginBottom="10dp"
android:textSize="20sp"
android:text="添加笔记"/> </LinearLayout>

note_item.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">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:lines="1"
android:text=""
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:lines="1"/>
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="" />
</LinearLayout>

note_editor.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:background="#eaeaea"
android:orientation="vertical"> <EditText
android:id="@+id/et_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="请输入标题">
<requestFocus />
</EditText>
<TextView
android:id="@+id/edit_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#d7d5d5"
android:gravity="right"
android:textSize="10sp"/>
<EditText
android:id="@+id/et_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="请输入内容"
android:gravity="left"/> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"> <Button
android:id="@+id/btn_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:text="保存"
android:textSize="20sp"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:text="取消"
android:textSize="20sp"/> </LinearLayout>
</LinearLayout>

activity_show.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"> <EditText
android:id="@+id/show_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="标题">
<requestFocus />
</EditText>
<TextView
android:id="@+id/show_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:textSize="10sp"/>
<EditText
android:id="@+id/show_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="内容"
android:gravity="left"/> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"> <Button
android:id="@+id/show_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:text="保存"
android:textSize="20sp"/>
<Button
android:id="@+id/show_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:text="取消"
android:textSize="20sp"/> </LinearLayout>
</LinearLayout>
  • 功能实现

首先SQLite数据库的创建。新建一个DBService类继承自SQLiteOpenHelper,设置静态常量属性,表名、id、标题、内容、创建时间。

DBService.java

package zut.edu.cn.notepad;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class DBService extends SQLiteOpenHelper {
public static final String TABLE = "notes";
public static final String ID = "_id";
public static final String TITLE ="title";
public static final String CONTENT = "content";
public static final String TIME = "time";
public DBService(Context context) {
super(context,"notepad.db",null,1);
} @Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE "+TABLE+"( "+ID+
" INTEGER PRIMARY KEY AUTOINCREMENT, "+
TITLE +" VARCHAR(30) ,"+
CONTENT + " TEXT , "+
TIME + " DATETIME NOT NULL )";
db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

MainActivity.java

package zut.edu.cn.notepad;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { DBService myDb;
private Button mBtnAdd;
private ListView lv_note;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化自己创建的数据库类
myDb = new DBService(this);
//初始化函数
init();
} public void init(){ mBtnAdd = findViewById(R.id.btn_add);
lv_note = findViewById(R.id.lv_note);
//创建Values类型的list保存数据库中的数据
List<Values> valuesList = new ArrayList<>();
//获得可读SQLiteDatabase对象
SQLiteDatabase db = myDb.getReadableDatabase(); //查询数据库中的数据
Cursor cursor = db.query(DBService.TABLE,null,null,
null,null,null,null);
if(cursor.moveToFirst()){
Values values;
while (!cursor.isAfterLast()){
//实例化values对象
values = new Values(); //把数据库中的一个表中的数据赋值给values
values.setId(Integer.valueOf(cursor.getString(cursor.getColumnIndex(DBService.ID))));
values.setTitle(cursor.getString(cursor.getColumnIndex(DBService.TITLE)));
values.setContent(cursor.getString(cursor.getColumnIndex(DBService.CONTENT)));
values.setTime(cursor.getString(cursor.getColumnIndex(DBService.TIME))); //将values对象存入list对象数组中
valuesList.add(values);
cursor.moveToNext();
}
}
cursor.close();
db.close(); //设置list组件adapter
final MyBaseAdapter myBaseAdapter = new MyBaseAdapter(valuesList,this,R.layout.note_item);
lv_note.setAdapter(myBaseAdapter); //按钮点击事件
mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, zut.edu.cn.notepad.EditActivity.class);
startActivity(intent);
}
}); //单击查询
lv_note.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this,ShowActivity.class);
Values values = (Values) lv_note.getItemAtPosition(position);
intent.putExtra(DBService.TITLE,values.getTitle().trim());
intent.putExtra(DBService.CONTENT,values.getContent().trim());
intent.putExtra(DBService.TIME,values.getTime().trim());
intent.putExtra(DBService.ID,values.getId().toString().trim());
startActivity(intent);
}
}); //长按删除
lv_note.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
final Values values = (Values) lv_note.getItemAtPosition(position);
new AlertDialog.Builder(MainActivity.this)
.setTitle("提示框")
.setMessage("是否删除?")
.setPositiveButton("yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SQLiteDatabase db = myDb.getWritableDatabase();
db.delete(DBService.TABLE,DBService.ID+"=?",new String[]{String.valueOf(values.getId())});
db.close();
myBaseAdapter.removeItem(position);
lv_note.post(new Runnable() {
@Override
public void run() {
myBaseAdapter.notifyDataSetChanged();
}
});
//MainActivity.this.onResume();
}
})
.setNegativeButton("no",null).show();
return true;
}
});
}
//创建继承自BaseAdapter的实现类进行ListView的展示
class MyBaseAdapter extends BaseAdapter{ private List<Values> valuesList;
private Context context;
private int layoutId; public MyBaseAdapter(List<Values> valuesList, Context context, int layoutId) {
this.valuesList = valuesList;
this.context = context;
this.layoutId = layoutId;
} @Override
public int getCount() {
if (valuesList != null && valuesList.size() > 0)
return valuesList.size();
else
return 0;
} @Override
public Object getItem(int position) {
if (valuesList != null && valuesList.size() > 0)
return valuesList.get(position);
else
return null;
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(
getApplicationContext()).inflate(R.layout.note_item, parent,
false);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) convertView.findViewById(R.id.tv_title);
viewHolder.content = convertView.findViewById(R.id.tv_content);
viewHolder.time = (TextView) convertView.findViewById(R.id.tv_time);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String title = valuesList.get(position).getTitle();
String content = valuesList.get(position).getContent();
viewHolder.title.setText(title);
viewHolder.content.setText(content);
viewHolder.time.setText(valuesList.get(position).getTime());
return convertView;
}
public void removeItem(int position){
this.valuesList.remove(position);
} }
class ViewHolder{
TextView title;
TextView content;
TextView time;
}
}

Values.java

Values类实现对数据的保存

package zut.edu.cn.notepad;

public class Values {
private Integer id;
private String title;
private String content;
private String time; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getTime() {
return time;
} public void setTime(String time) {
this.time = time;
} @Override
public String toString() {
return "Values{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
", time='" + time + '\'' +
'}';
}
}

Edit_Activity.java

package zut.edu.cn.notepad;

import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import java.text.SimpleDateFormat;
import java.util.Date; public class EditActivity extends AppCompatActivity { DBService myDb;
private Button btnCancel;
private Button btnSave;
private EditText titleEditText;
private EditText contentEditText;
private TextView timeTextView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_editor); init();
if(timeTextView.getText().length()==0)
timeTextView.setText(getTime());
} private void init() { myDb = new DBService(this);
SQLiteDatabase db = myDb.getReadableDatabase();
titleEditText = findViewById(R.id.et_title);
contentEditText = findViewById(R.id.et_content);
timeTextView = findViewById(R.id.edit_time);
btnCancel = findViewById(R.id.btn_cancel);
btnSave = findViewById(R.id.btn_save); //按钮点击事件
btnCancel.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(EditActivity.this,MainActivity.class);
startActivity(intent);
}
});
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { SQLiteDatabase db = myDb.getWritableDatabase();
ContentValues values = new ContentValues(); String title= titleEditText.getText().toString();
String content=contentEditText.getText().toString();
String time= timeTextView.getText().toString(); if("".equals(titleEditText.getText().toString())){
Toast.makeText(EditActivity.this,"标题不能为空",Toast.LENGTH_LONG).show();
return;
}
if("".equals(contentEditText.getText().toString())) {
Toast.makeText(EditActivity.this,"内容不能为空",Toast.LENGTH_LONG).show();
return;
}
values.put(DBService.TITLE,title);
values.put(DBService.CONTENT,content);
values.put(DBService.TIME,time);
db.insert(DBService.TABLE,null,values);
Toast.makeText(EditActivity.this,"保存成功",Toast.LENGTH_LONG).show();
Intent intent = new Intent(EditActivity.this,MainActivity.class);
startActivity(intent);
db.close();
}
});
} //获取当前时间
private String getTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
String str = sdf.format(date);
return str;
} }

ShowActivity

package zut.edu.cn.notepad;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import java.text.SimpleDateFormat;
import java.util.Date; public class ShowActivity extends AppCompatActivity { private Button btnSave;
private Button btnCancel;
private TextView showTime;
private EditText showContent;
private EditText showTitle; private Values value;
DBService myDb; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show); init();
} public void init() {
myDb = new DBService(this);
btnCancel = findViewById(R.id.show_cancel);
btnSave = findViewById(R.id.show_save);
showTime = findViewById(R.id.show_time);
showTitle = findViewById(R.id.show_title);
showContent = findViewById(R.id.show_content); Intent intent = this.getIntent();
if (intent != null) {
value = new Values(); value.setTime(intent.getStringExtra(DBService.TIME));
value.setTitle(intent.getStringExtra(DBService.TITLE));
value.setContent(intent.getStringExtra(DBService.CONTENT));
value.setId(Integer.valueOf(intent.getStringExtra(DBService.ID))); showTime.setText(value.getTime());
showTitle.setText(value.getTitle());
showContent.setText(value.getContent());
} //按钮点击事件
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = myDb.getWritableDatabase();
ContentValues values = new ContentValues();
String content = showContent.getText().toString();
String title = showTitle.getText().toString(); values.put(DBService.TIME, getTime());
values.put(DBService.TITLE,title);
values.put(DBService.CONTENT,content); db.update(DBService.TABLE,values,DBService.ID+"=?",new String[]{value.getId().toString()});
Toast.makeText(ShowActivity.this,"修改成功",Toast.LENGTH_LONG).show();
db.close();
Intent intent = new Intent(ShowActivity.this,MainActivity.class);
startActivity(intent);
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String content = showContent.getText().toString();
final String title = showTitle.getText().toString();
new AlertDialog.Builder(ShowActivity.this)
.setTitle("提示框")
.setMessage("是否保存当前内容?")
.setPositiveButton("yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SQLiteDatabase db = myDb.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DBService.TIME, getTime());
values.put(DBService.TITLE,title);
values.put(DBService.CONTENT,content);
db.update(DBService.TABLE,values,DBService.ID+"=?",new String[]{value.getId().toString()});
Toast.makeText(ShowActivity.this,"修改成功",Toast.LENGTH_LONG).show();
db.close();
Intent intent = new Intent(ShowActivity.this,MainActivity.class);
startActivity(intent);
}
})
.setNegativeButton("no",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(ShowActivity.this,MainActivity.class);
startActivity(intent);
}
}).show();
}
});
} String getTime() {
@SuppressLint("SimpleDateFormat")
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
//获取当前时间
Date date = new Date(System.currentTimeMillis());
return simpleDateFormat.format(date);
}
}

偷偷地写在最后

基本实现就是以上了,还有很多地方不太完善,希望能够从一次一次的实践当中学习到更多的东西。

曾经沧海难为水,除却巫山不是云。

源码已上传:github.Notepad

参考博客:https://blog.csdn.net/zouguo1211/article/details/83474845

Android 简单记事本的更多相关文章

  1. Android简易记事本

    此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改, ...

  2. Android简单逐帧动画Frame的实现(二)

    Android简单逐帧动画Frame的实现   Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...

  3. Python开发简单记事本

    摘要: 本文是使用Python,结合Tkinter开发简单记事本. 本文的操作环境:ubuntu,Python2.7,采用的是Pycharm进行代码编辑,个人很喜欢它的代码自动补齐功能. 最近很想对p ...

  4. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  5. 简单记事本的基本实现&十四周总结

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  6. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  7. android简单登陆和注册功能实现+SQLite数据库学习

    最近初学android,做了实验室老师给的基本任务,就是简单的登陆和注册,并能通过SQLite实现登陆,SQlLite是嵌入在安卓设备中的 好了下面是主要代码: 数据库的建立: 这里我只是建立了一个用 ...

  8. Android简单的ListViewDemo及每个控件的点击事件

    ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...

  9. Android简单加密保护自有图片资源

    现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密.这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望 ...

随机推荐

  1. for循环的beak continue用法

    continue跳出该循环, for循环后面的都要执行.break直接中段循环 后面不执行了

  2. Python super初始化理解过程

    # -*- coding:utf-8 -*-<br data-filtered="filtered"> class A(object): def __init__(se ...

  3. h5页面适配小结

    大概是去年的7月想写这个内容去加深自己的理解.现在终于回来补上这篇入门小结了. 1.问题描述 适配的目标:在不同尺寸的手机设备上,页面“相对性的达到合理的展示(自适应)”或者“保持统一效果的等比缩放( ...

  4. python的库小全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  5. centos7.2 Apache+PHP7.2+Mysql5.6环境搭建

    yum安装PHP7.2 由于linux的yum源不存在php7.x,所以我们要更改yum源:rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-re ...

  6. Rsync数据同步工具

                                        Rsync数据同步工具 什么是Rsync? Rsync是一款开源的.快速的.多功能的,可以实现全量及增量的本地或原程数据同步备份 ...

  7. (.NET高级课程笔记)泛型总结

    泛型总结 1.引入泛型:延迟声明,即在声明的时候没有指定参数类型,只有当调用的时候才会确定 其参数类型(架构师的理念:推迟一切可以推迟的) 2.如何声明和使用泛型 3.泛型的好处和原理 4.泛型类.泛 ...

  8. C#6.0,C#7.0新特性

    C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...

  9. bochs模拟器创建映像文件 、写入文件并启动

    安装 bochs,dd for windows,nasm,并将安装目录加入到环境变量中. 我用的bochs版本是2.6.8 1.用 bochs 中 bximage.exe 创建新的 img 文件 2. ...

  10. python,day3,函数基础-3

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...