Android简易记事本
此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下:
具体操作就是长按可以删除操作,点击可以进行修改,点击添加笔记
按钮可以添加一个笔记。
首先我们需要三个界面样式一个是我们的进入程序时的第一个界面,然后第一个界面里面有一个ListView
,这个ListView
需要一个xml来描述里面的各个元素,这也是第二个。还有一个就是我们的编辑页面的界面。
三个xml描述文件如下:
activity_main.xml:进入程序的第一个界面
<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:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="记事本列表"
android:textSize="20sp"
android:paddingTop="10dp"
android:paddingBottom="5dp"
android:gravity="center"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" >
<ListView
android:id="@+id/listNote"
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
<Button
android:id="@+id/addNote"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:text="添加笔记"
android:textSize="20sp" />
</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/noteTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/noteCreateTime"
android:layout_width="fill_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:orientation="vertical" >
<TextView
android:id="@+id/noteId"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<EditText
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="输入标题">
<requestFocus />
</EditText>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="输入内容"
android:gravity="left">
</EditText>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
android:gravity="center">
<Button
android:id="@+id/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/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>
现在我们可以考虑我们底层的数据库的操作了,这里有一个类专门用于与数据库打交道,如下:
DBService.java
public class DBService {
private static SQLiteDatabase db = null;
static {
//新建或者打开db
db = SQLiteDatabase.openOrCreateDatabase("data/data/cn.lger.notebook/NoteBook.db", null);
String sql = "create table NoteBook(_id integer primary key autoincrement,title varchar(255),content TEXT, createTime varchar(25))";
//判断是否存在表NoteBook,如果不存在会抛出异常,捕捉异常后创建表
try{
db.rawQuery("select count(1) from NoteBook ",null);
}catch(Exception e){
db.execSQL(sql);
}
}
public static SQLiteDatabase getSQLiteDatabase(){
return db;
}
public static Cursor queryAll(){
return db.rawQuery("select * from NoteBook ",null);
}
public static Cursor queryNoteById(Integer id){
return db.rawQuery("select * from NoteBook where _id =?",new String[]{id.toString()});
}
public static void deleteNoteById(Integer id){
if(id == null)
return ;
db.delete("NoteBook", "_id=?", new String[]{id.toString()});
}
public static void updateNoteById(Integer id, ContentValues values){
db.update("NoteBook", values, "_id=?", new String[]{id.toString()});
}
/**
* 添加一个笔记,并且记录当前添加的时间
* @param values 表中的各个字段值
*/
public static void addNote(ContentValues values){
values.put("createTime", DateFormat.format("yyyy-MM-dd kk:mm:ss", System.currentTimeMillis()).toString());
db.insert("NoteBook", null, values);
}
}
下面我们在进入第一个界面的时候需要访问数据库并且将数据的值不断的更新(比如进行了删除操作的时候或者添加操作之后需要刷新),这样,我们就可能需要重写Activity
的onResume()
,这样就可以调用Cursor
的requery()
来刷新我们列表中ListView
的结果。还有我们需要长按删除,点击修改,添加笔记这些都需要监听事件,因此,这里还要设置监听
具体MainActivity.java的代码如下:
public class MainActivity extends Activity {
private Cursor listItemCursor = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置添加笔记按钮事件,切换activity
this.findViewById(R.id.addNote).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent in = new Intent();
in.setClassName(getApplicationContext(),
"cn.lger.notebook.NoteEditActivity");
startActivity(in);
}
});
// 查询所有笔记,并将笔记展示出来
listItemCursor = DBService.queryAll();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.note_item, listItemCursor, new String[] { "_id",
"title", "createTime" }, new int[] { R.id.noteId,
R.id.noteTitle, R.id.noteCreateTime },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
((ListView) this.findViewById(R.id.listNote)).setAdapter(adapter);
initListNoteListener();
}
/**
* 初始化笔记列表的长按和点击事件
*/
private void initListNoteListener() {
// 长按删除
((ListView) this.findViewById(R.id.listNote))
.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent,
View view, int position, final long id) {
new AlertDialog.Builder(MainActivity.this)
.setTitle("提示框")
.setMessage("确认删除该笔记??")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0,int arg1) {
DBService.deleteNoteById((int) id);
//删除后刷新列表
MainActivity.this.onResume();
Toast.makeText(
MainActivity.this,
"删除成功!!",
Toast.LENGTH_LONG)
.show();
}
}).setNegativeButton("取消", null).show();
return true;
}
});
//点击进行修改操作
((ListView) this.findViewById(R.id.listNote))
.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent in = new Intent();
in.setClassName(view.getContext(),
"cn.lger.notebook.NoteEditActivity");
// 将id数据放置到Intent,切换视图后可以将数据传递过去
in.putExtra("id", id);
startActivity(in);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 当从另一个视图进入该视图会调用该方法
*/
@Override
protected void onResume() {
super.onResume();
// 要求刷新主页列表笔记
if (listItemCursor != null) {
listItemCursor.requery();
}
}
}
上面的代码中还涉及到了一个视图切换后的传递信息的操作,就是通过Intent
的putExtra(key, value)
这样可以在切换后的视图中调用函数getIntent().get~Extra(key, replace);
来接收传递的数据。
下面是我们的编辑界面中对应的具体实现代码,这里有判断是使用更新操作还是添加操作,主要是判断MainActivity.java有没有传递过来id
,如果有就是通过这个id
来更新操作,没有就是添加操作。
编辑界面对应的具体实现代码如下:
NoteEditActivity.java
public class NoteEditActivity extends Activity {
private EditText titleEditText = null;
private EditText contentEditText = null;
private String noteId = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_editor);
titleEditText = (EditText) NoteEditActivity.this
.findViewById(R.id.title);
contentEditText = (EditText) NoteEditActivity.this
.findViewById(R.id.content);
initNoteEditValue();
//取消按钮监听
this.findViewById(R.id.cancel).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View arg0) {
NoteEditActivity.this.finish();
}
});
this.findViewById(R.id.save).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
final String title = titleEditText.getText().toString();
final String content = contentEditText.getText().toString();
//判断标题和内容是否为空,不为空才能保存
if ("".equals(title) || "".equals(content)) {
Toast.makeText(NoteEditActivity.this, "标题或者内容不能为空",
Toast.LENGTH_LONG).show();
return;
}
//提示保存
new AlertDialog.Builder(NoteEditActivity.this)
.setTitle("提示框")
.setMessage("确定保存笔记吗??")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0,
int arg1) {
ContentValues values = new ContentValues();
values.put("title", title);
values.put("content", content);
//如果noteId不为空那么就是更新操作,为空就是添加操作
if (null == noteId || "".equals(noteId))
DBService.addNote(values);
else
DBService.updateNoteById(
Integer.valueOf(noteId),
values);
//结束当前activity
NoteEditActivity.this.finish();
Toast.makeText(NoteEditActivity.this, "保存成功!!",
Toast.LENGTH_LONG).show();
}
}).setNegativeButton("取消", null).show();
}
});
}
/**
* 初始化编辑页面的值(如果进入该页面时存在一个id的话),比如标题,内容。
*/
private void initNoteEditValue() {
// 从Intent中获取id的值
long id = this.getIntent().getLongExtra("id", -1L);
// 如果有传入id那么id!=-1
if (id != -1L) {
// 使用noteId保存id
noteId = String.valueOf(id);
// 查询该id的笔记
Cursor cursor = DBService.queryNoteById((int) id);
if (cursor.moveToFirst()) {
// 将内容提取出来
titleEditText.setText(cursor.getString(1));
contentEditText.setText(cursor.getString(2));
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
以上就将我们的安卓简易记事本完成了,源码已经上传GitHub。
界面采用了拿来主义,可以参考下面文章
http://blog.csdn.net/cjs68/article/details/50211543
Android简易记事本的更多相关文章
- 《winform窗体应用程序》----------简易记事本
首先先给大家发表几张图片,描述一下记事本程序要实现的功能以及界面设计. 以上这些就是简易记事本的的主界面设计. 下面我们来做一些简单的讲解: 1.使用MenuStrip控件来实现菜单栏的基本设计. 在 ...
- Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
- Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》
之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...
- Android简易实战教程--第一话《最简单的计算器》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51707931 从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专 ...
- Android简易项目--傻瓜式阿拉伯语输入法(Dummy Arabic Input)
一.应用名称 Android简易项目--傻瓜式阿拉伯语输入法(Dummy Arabic Input) 二.应用图标 三.应用说明 现在通行的阿拉伯语键盘布局并无规律可循,阿拉伯语使用者需要花费较多时间 ...
- 微信小程序 - 实战小案例 - 简易记事本
多项技能,好像也不错.学习一下微信小程序. 教程:https://mp.weixin.qq.com/debug/wxadoc/dev/ 简介:一套用来开发在手机微信上运行的app框架,不用安装 组成: ...
- Java图形界面开发—简易记事本
在学习了Java事件之后,自己写了一个极其简单的记事本.用到了MenuBar,Menu,MenuITem等控件,事件包括ActionListener以及KeyListener. 代码如下: ...
- python做简易记事本
以下内容参考<辛星tkinter教程第二版>: from tkinter import * from tkinter.filedialog import * from tkinter.me ...
随机推荐
- 第五章——定时器Timer序言
定时器很重要. 上家公司有用的,是用来做定期数据同步的. 以前老同学有用到,曾经就定时器讨论过一次,还给过一次他我关于spring-task的总结. 但是并没有意识到定时器与多线程的关系,或者说,上一 ...
- 在Visual Studio 中开发Office Add-in
作者:陈希章 发表于2017年7月13日 "Talk is cheap, show me the code",我们就用代码来说话吧.这一篇将给大家介绍如何开始Office Add- ...
- Python笔记·第五章—— 列表(List) 的增删改查及其他方法
一.列表的简介 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...
- FiddlerCoreAPI开发(二)截获HTTPS流量
上一篇文章简单简单分析了fiddlercore自带样例的代码,本篇文章进入主题,介绍如何使用fiddlercore截获HTTPS流量. 当时学习完样例代码后,我觉得结合注释来抓HTTPS的包应该也很简 ...
- 如何在华为云软件开发云上搭建JavaWeb,Maven项目
本文将使用华为云软件开发云向大家演示如何搭建JavaWeb,Maven项目. 一.相关信息 1.华为云软件开发云简介 华为云软件开发云(DevCloud)是集华为近30年研发实践,前沿研发理念,先进研 ...
- 原生js版分页插件
之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来.如有不足之处,欢迎指 ...
- Nginx各种配置
日志 日志中属性 $remote_addr,$http_x_forwarded_for 记录客户端IP地址 $remote_user 记录客户端用户名称 $request 记录请求的URL和HTTP协 ...
- 【CSS3】内联、内部、外部样式,样式优先级、层叠、继承
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 那些容易遗忘的web前端问题
背景: 年底将至,本人这只才出门的前端菜鸟,终于有空闲的时间来整理一下最近投简历时出现的问题.有的是经常使用但是没有仔细留意造成的:有的是个人认为根本没人使用而忽略的.为了下次不出现这种错误,进行一下 ...
- Visual Studio Code 快捷键大全(Windows)
Visual Studio Code 是一款优秀的编辑器,非常适合编写 TS 以及 React .最近在学习 AngularJs 2,开始使用 VSCode,特意整理翻译了一下官网的快捷键.因为已经习 ...