热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

android实现记事本app

自己写的一个简单的记事本app,效果如下: 一、首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayou

自己写的一个简单的记事本app,效果如下:

一、首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button。下面附上第一个页面的简单布局xml文件。

 
  
 
  
 
  
  
  
 
 

至于button的样式btn_selector就是自己定义的button样式。

二、其次就是设置ListView中数据显示的xml文件,代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
 
  
 
 

三、编写第二个界面样式,第二个界面是最上面一个linearlayout,里面包含两个button和一个TextView。代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
 
 

四、将日志的数据保存在数据库中,使用sqlite来创建数据库,数据库中有三个属性,"_id"、"content"、"date"这三个属性,创建一个NoteDB来创建数据库。

package com.example.datenote; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 
 
public class NotesDB extends SQLiteOpenHelper { 
 
 public static final String TABLE_NAME_NOTES = "note"; 
 public static final String COLUMN_NAME_ID = "_id"; 
 public static final String COLUMN_NAME_NOTE_COnTENT= "content"; 
 public static final String COLUMN_NAME_NOTE_DATE = "date"; 
 
 public NotesDB(Context context) { 
 super(context, "note", null, 1); 
 // TODO Auto-generated constructor stub 
 } 
 
 @Override 
 public void onCreate(SQLiteDatabase db) { 
 String sql = "CREATE TABLE " + TABLE_NAME_NOTES + "(" + COLUMN_NAME_ID 
 + " INTEGER PRIMARY KEY AUTOINCREMENT," 
 + COLUMN_NAME_NOTE_CONTENT + " TEXT NOT NULL DEFAULT\"\"," 
 + COLUMN_NAME_NOTE_DATE + " TEXT NOT NULL DEFAULT\"\"" + ")"; 
 Log.d("SQL", sql); 
 db.execSQL(sql); 
// String sql1="insert into "+TABLE_NAME_NOTES+"values("+"1,"+"'写作业',"+"'晚上要写作业的干活'"+")"; 
// Log.d("SQL1", sql1); 
// db.execSQL(sql1); 
// ContentValues values=new ContentValues(); 
// values.put("id",1); 
// values.put("content","写作业"); 
// values.put("date", "2013-1-2"); 
// db.insert("note", null, values); 
 
 } 
 
 @Override 
 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
 // TODO Auto-generated method stub 
 
 } 
 
} 

五、实现点击添加事件的跳转,在第一个页面中点击添加备忘录后会跳转到第二个界面,设置点击事件,由一个activity跳转到另外一个activity,我使用的是intent方式。另外,在ListView中点击每个已记录下来的日志也会跳转到第二个界面,只是显示的不是空白的EditText,而是包含日志的EditText。MainActivity如下:

package com.example.datenote; 
 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
 
public class MainActivity extends Activity implements OnScrollListener, 
 OnItemClickListener, OnItemLongClickListener { 
 
 private Context mContext; 
 private ListView listview; 
 private SimpleAdapter simp_adapter; 
 private List> dataList; 
 private Button addNote; 
 private TextView tv_content; 
 private NotesDB DB; 
 private SQLiteDatabase dbread; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 requestWindowFeature(Window.FEATURE_NO_TITLE); 
 setContentView(R.layout.activity_main); 
 tv_cOntent= (TextView) findViewById(R.id.tv_content); 
 listview = (ListView) findViewById(R.id.listview); 
 dataList = new ArrayList>(); 
 
 addNote = (Button) findViewById(R.id.btn_editnote); 
 mCOntext= this; 
 addNote.setOnClickListener(new OnClickListener() { 
 
 @Override 
 public void onClick(View arg0) { 
 noteEdit.ENTER_STATE = 0; 
 Intent intent = new Intent(mContext, noteEdit.class); 
 Bundle bundle = new Bundle(); 
 bundle.putString("info", ""); 
 intent.putExtras(bundle); 
 startActivityForResult(intent, 1); 
 } 
 }); 
 DB = new NotesDB(this); 
 dbread = DB.getReadableDatabase(); 
 // 清空数据库中表的内容 
 //dbread.execSQL("delete from note"); 
 RefreshNotesList(); 
 
 listview.setOnItemClickListener(this); 
 listview.setOnItemLongClickListener(this); 
 listview.setOnScrollListener(this); 
 } 
 
 public void RefreshNotesList() { 
 
 int size = dataList.size(); 
 if (size > 0) { 
 dataList.removeAll(dataList); 
 simp_adapter.notifyDataSetChanged(); 
 listview.setAdapter(simp_adapter); 
 } 
 simp_adapter = new SimpleAdapter(this, getData(), R.layout.item, 
 new String[] { "tv_content", "tv_date" }, new int[] { 
  R.id.tv_content, R.id.tv_date }); 
 listview.setAdapter(simp_adapter); 
 } 
 
 private List> getData() { 
 
 Cursor cursor = dbread.query("note", null, "content!=\"\"", null, null, 
 null, null); 
 
 while (cursor.moveToNext()) { 
 String name = cursor.getString(cursor.getColumnIndex("content")); 
 String date = cursor.getString(cursor.getColumnIndex("date")); 
 Map map = new HashMap(); 
 map.put("tv_content", name); 
 map.put("tv_date", date); 
 dataList.add(map); 
 } 
 cursor.close(); 
 return dataList; 
 
 } 
 
 @Override 
 public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { 
 // TODO Auto-generated method stub 
 
 } 
 
 // 滑动listview监听事件 
 @Override 
 public void onScrollStateChanged(AbsListView arg0, int arg1) { 
 // TODO Auto-generated method stub 
 switch (arg1) { 
 case SCROLL_STATE_FLING: 
 Log.i("main", "用户在手指离开屏幕之前,由于用力的滑了一下,视图能依靠惯性继续滑动"); 
 case SCROLL_STATE_IDLE: 
 Log.i("main", "视图已经停止滑动"); 
 case SCROLL_STATE_TOUCH_SCROLL: 
 Log.i("main", "手指没有离开屏幕,试图正在滑动"); 
 } 
 } 
 
 // 点击listview中某一项的监听事件 
 @Override 
 public void onItemClick(AdapterView<&#63;> arg0, View arg1, int arg2, long arg3) { 
 noteEdit.ENTER_STATE = 1; 
 // Log.d("arg2", arg2 + ""); 
 // TextView 
 // cOntent=(TextView)listview.getChildAt(arg2).findViewById(R.id.tv_content); 
 // String content1=content.toString(); 
 String cOntent= listview.getItemAtPosition(arg2) + ""; 
 String content1 = content.substring(content.indexOf("=") + 1, 
 content.indexOf(",")); 
 Log.d("CONTENT", content1); 
 Cursor c = dbread.query("note", null, 
 "cOntent=" + "'" + content1 + "'", null, null, null, null); 
 while (c.moveToNext()) { 
 String No = c.getString(c.getColumnIndex("_id")); 
 Log.d("TEXT", No); 
 // Intent intent = new Intent(mContext, noteEdit.class); 
 // intent.putExtra("data", text); 
 // setResult(4, intent); 
 // // intent.putExtra("data",text); 
 // startActivityForResult(intent, 3); 
 Intent myIntent = new Intent(); 
 Bundle bundle = new Bundle(); 
 bundle.putString("info", content1); 
 noteEdit.id = Integer.parseInt(No); 
 myIntent.putExtras(bundle); 
 myIntent.setClass(MainActivity.this, noteEdit.class); 
 startActivityForResult(myIntent, 1); 
 } 
 
 } 
 
 @Override 
 // 接受上一个页面返回的数据,并刷新页面 
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 // TODO Auto-generated method stub 
 super.onActivityResult(requestCode, resultCode, data); 
 if (requestCode == 1 && resultCode == 2) { 
 RefreshNotesList(); 
 } 
 } 
 
 // 点击listview中某一项长时间的点击事件 
 @Override 
 public boolean onItemLongClick(AdapterView<&#63;> arg0, View arg1, int arg2, 
 long arg3) { 
 final int n=arg2; 
 Builder builder = new AlertDialog.Builder(this); 
 builder.setTitle("删除该日志"); 
 builder.setMessage("确认删除吗?"); 
 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 
 @Override 
 public void onClick(DialogInterface dialog, int which) { 
 String cOntent= listview.getItemAtPosition(n) + ""; 
 String content1 = content.substring(content.indexOf("=") + 1, 
  content.indexOf(",")); 
 Cursor c = dbread.query("note", null, "cOntent=" + "'" 
  + content1 + "'", null, null, null, null); 
 while (c.moveToNext()) { 
  String id = c.getString(c.getColumnIndex("_id")); 
  String sql_del = "update note set cOntent='' where _id=" 
  + id; 
  dbread.execSQL(sql_del); 
  RefreshNotesList(); 
 } 
 } 
 }); 
 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 
 @Override 
 public void onClick(DialogInterface dialog, int which) { 
 } 
 }); 
 builder.create(); 
 builder.show(); 
 return true; 
 } 
 
} 

六、编写第二个跳转后界面的Activity,如下:

package com.example.datenote; 
 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteStatement; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
 
public class noteEdit extends Activity { 
 private TextView tv_date; 
 private EditText et_content; 
 private Button btn_ok; 
 private Button btn_cancel; 
 private NotesDB DB; 
 private SQLiteDatabase dbread; 
 public static int ENTER_STATE = 0; 
 public static String last_content; 
 public static int id; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 // TODO Auto-generated method stub 
 super.onCreate(savedInstanceState); 
 // 设置无标题 
 requestWindowFeature(Window.FEATURE_NO_TITLE); 
 setContentView(R.layout.edit); 
 
 tv_date = (TextView) findViewById(R.id.tv_date); 
 Date date = new Date(); 
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
 String dateString = sdf.format(date); 
 tv_date.setText(dateString); 
 
 et_cOntent= (EditText) findViewById(R.id.et_content); 
 // 设置软键盘自动弹出 
 getWindow().setSoftInputMode( 
 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
 
 DB = new NotesDB(this); 
 dbread = DB.getReadableDatabase(); 
 
 Bundle myBundle = this.getIntent().getExtras(); 
 last_cOntent= myBundle.getString("info"); 
 Log.d("LAST_CONTENT", last_content); 
 et_content.setText(last_content); 
 // 确认按钮的点击事件 
 btn_ok = (Button) findViewById(R.id.btn_ok); 
 btn_ok.setOnClickListener(new OnClickListener() { 
 public void onClick(View arg0) { 
 // 获取日志内容 
 String cOntent= et_content.getText().toString(); 
 Log.d("LOG1", content); 
 // 获取写日志时间 
 Date date = new Date(); 
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
 String dateNum = sdf.format(date); 
 String sql; 
 String sql_count = "SELECT COUNT(*) FROM note"; 
 SQLiteStatement statement = dbread.compileStatement(sql_count); 
 long count = statement.simpleQueryForLong(); 
 Log.d("COUNT", count + ""); 
 Log.d("ENTER_STATE", ENTER_STATE + ""); 
 // 添加一个新的日志 
 if (ENTER_STATE == 0) { 
  if (!content.equals("")) { 
  sql = "insert into " + NotesDB.TABLE_NAME_NOTES 
  + " values(" + count + "," + "'" + content 
  + "'" + "," + "'" + dateNum + "')"; 
  Log.d("LOG", sql); 
  dbread.execSQL(sql); 
  } 
 } 
 // 查看并修改一个已有的日志 
 else { 
  Log.d("执行命令", "执行了该函数"); 
  String updatesql = "update note set cOntent='" 
  + content + "' where _id=" + id; 
  dbread.execSQL(updatesql); 
  // et_content.setText(last_content); 
 } 
 Intent data = new Intent(); 
 setResult(2, data); 
 finish(); 
 } 
 }); 
 btn_cancel = (Button) findViewById(R.id.btn_cancel); 
 btn_cancel.setOnClickListener(new OnClickListener() { 
 public void onClick(View arg0) { 
 finish(); 
 } 
 }); 
 } 
 
 @Override 
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 // TODO Auto-generated method stub 
 super.onActivityResult(requestCode, resultCode, data); 
 // if (requestCode == 3 && resultCode == 4) { 
 // last_cOntent=data.getStringExtra("data"); 
 // Log.d("LAST_STRAING", last_content+"gvg"); 
 // } 
 } 
} 

七、其中,对ListView添加OnItemLongclicklistener,长点击之后会弹出一个dialog对话框提醒要不要删除该日志文件。

public boolean onItemLongClick(AdapterView<&#63;> arg0, View arg1, int arg2, 
 long arg3) { 
 final int n=arg2; 
 Builder builder = new AlertDialog.Builder(this); 
 builder.setTitle("删除该日志"); 
 builder.setMessage("确认删除吗?"); 
 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 
 @Override 
 public void onClick(DialogInterface dialog, int which) { 
 String cOntent= listview.getItemAtPosition(n) + ""; 
 String content1 = content.substring(content.indexOf("=") + 1, 
  content.indexOf(",")); 
 Cursor c = dbread.query("note", null, "cOntent=" + "'" 
  + content1 + "'", null, null, null, null); 
 while (c.moveToNext()) { 
  String id = c.getString(c.getColumnIndex("_id")); 
  String sql_del = "update note set cOntent='' where _id=" 
  + id; 
  dbread.execSQL(sql_del); 
  RefreshNotesList(); 
 } 
 } 
 }); 
 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 
 @Override 
 public void onClick(DialogInterface dialog, int which) { 
 } 
 }); 
 builder.create(); 
 builder.show(); 
 return true; 
 } 

注意最后将返回值设为true,否则会和OnItemClickListener产生冲突。

附上长点击删除的效果。

在结尾附上自己的代码,自己辛苦写的,收取一个资源不多吧,感兴趣的可以下载看看。

下载链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
author-avatar
强伟2502859647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有