本文基于Java实现了一个简单的记事本安卓app,用的是SQLite数据库,包括布局文件、源码及实现图。

布局设计

记事本主界面

<?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=".NoteActivity"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_marginTop="8dp"android:layout_below="@+id/myToolbar"android:divider="?attr/lvBackground"android:dividerHeight="8dp"></ListView><androidx.appcompat.widget.Toolbarandroid:id="@+id/myToolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:elevation="4dp"app:titleTextColor="?attr/titleColor"android:theme="?attr/toolbarTheme"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"></androidx.appcompat.widget.Toolbar><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_alignParentBottom="true"android:layout_marginEnd="36dp"android:layout_marginBottom="48dp"android:clickable="true"android:focusable="true"android:src="@drawable/ic_add_white_24dp"/></RelativeLayout>

对记事本编辑的页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"tools:context=".EditNoteActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/my_Toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:elevation="4dp"app:titleTextColor="?attr/titleColor"android:theme="?attr/toolbarTheme"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"></androidx.appcompat.widget.Toolbar><EditTextandroid:id="@+id/et"android:layout_width="match_parent"android:layout_height="200dp"android:inputType="text"android:gravity="top"></EditText></LinearLayout>

代码

Note实体类

记事信息实体类

public class Note {private long id;private String content;private String time;private int tag;public Note() {}public Note(String content, String time, int tag) {this.content = content;this.time = time;this.tag = tag;}public long getId() {return id;}public String getContent() {return content;}public String getTime() {return time;}public int getTag() {return tag;}public void setId(long id) {this.id = id;}public void setContent(String content) {this.content = content;}public void setTime(String time) {this.time = time;}public void setTag(int tag) {this.tag = tag;}@Overridepublic String toString() {return content + "\n" + time.substring(5, 16) + " " + id;}}

NoteActivity

记事本主界面的Activity

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.List;public class NoteActivity extends BaseActivity implements AdapterView.OnItemClickListener {FloatingActionButton btn;private ListView lv;private NoteAdapter adapter;private List<Note> noteList = new ArrayList<Note>();private Context context = this;private Toolbar myToolbar;final String TAG = "tag";private NoteDatabase dbHelper;private Menu menu;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_note);btn = (FloatingActionButton) findViewById(R.id.fab);lv = (ListView) findViewById(R.id.lv);myToolbar = findViewById(R.id.myToolbar);adapter = new NoteAdapter(getApplicationContext(), noteList);refreshListView();lv.setAdapter(adapter);setSupportActionBar(myToolbar);getSupportActionBar().setHomeButtonEnabled(true);getSupportActionBar().setDisplayHomeAsUpEnabled(true); //设置toolbar取代actionbarlv.setOnItemClickListener(this);myToolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp);myToolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(NoteActivity.this, SliderActivity.class));}});btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(NoteActivity.this, EditNoteActivity.class);intent.putExtra("mode", 4);startActivityForResult(intent, 0);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {int returnMode;long note_Id;returnMode = data.getExtras().getInt("mode", -1);note_Id = data.getExtras().getLong("id", 0);if (returnMode == 1) {  //update current noteString content = data.getExtras().getString("content");String time = data.getExtras().getString("time");int tag = data.getExtras().getInt("tag", 1);Note newNote = new Note(content, time, tag);newNote.setId(note_Id);CRUD op = new CRUD(context);op.open();op.updateNote(newNote);op.close();} else if (returnMode == 0) {  // create new noteString content = data.getExtras().getString("content");String time = data.getExtras().getString("time");int tag = data.getExtras().getInt("tag", 1);Note newNote = new Note(content, time, tag);CRUD op = new CRUD(context);op.open();op.addNote(newNote);op.close();} else if (returnMode == 2) { // deleteNote curNote = new Note();curNote.setId(note_Id);CRUD op = new CRUD(context);op.open();op.removeNote(curNote);op.close();} else {}refreshListView();super.onActivityResult(requestCode, resultCode, data);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main_menu, menu);//search settingMenuItem mSearch = menu.findItem(R.id.action_search);SearchView mSearchView = (SearchView) mSearch.getActionView();mSearchView.setQueryHint("Search");mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {return false;}@Overridepublic boolean onQueryTextChange(String newText) {adapter.getFilter().filter(newText);return false;}});return super.onCreateOptionsMenu(menu);}public void refreshListView() {CRUD op = new CRUD(context);op.open();// set adapterif (noteList.size() > 0) noteList.clear();noteList.addAll(op.getAllNotes());op.close();adapter.notifyDataSetChanged();}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {switch (parent.getId()) {case R.id.lv:Note curNote = (Note) parent.getItemAtPosition(position);Intent intent = new Intent(NoteActivity.this, EditNoteActivity.class);intent.putExtra("content", curNote.getContent());intent.putExtra("id", curNote.getId());intent.putExtra("time", curNote.getTime());intent.putExtra("mode", 3);     // MODE of 'click to edit'intent.putExtra("tag", curNote.getTag());startActivityForResult(intent, 1);      //collect data from editLog.d(TAG, "onItemClick: " + position);break;}}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_clear:new AlertDialog.Builder(NoteActivity.this).setMessage("删除全部吗?").setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dbHelper = new NoteDatabase(context);SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("notes", null, null);db.execSQL("update sqlite_sequence set seq=0 where name='notes'");refreshListView();}}).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).create().show();break;}return super.onOptionsItemSelected(item);}
}

NoteAdapter

适配器为主界面列表绑定数据

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;public class NoteAdapter extends BaseAdapter implements Filterable {private Context mContext;private List<Note> backList;//用来备份原始数据private List<Note> noteList;//这个数据是会改变的,所以要有个变量来备份一下原始数据private MyFilter mFilter;public NoteAdapter(Context mContext, List<Note> noteList) {this.mContext = mContext;this.noteList = noteList;backList = noteList;}@Overridepublic int getCount() {return noteList.size();}@Overridepublic Object getItem(int position) {return noteList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);mContext.setTheme(R.style.DayTheme);View v = View.inflate(mContext, R.layout.note_layout, null);TextView tv_content = (TextView) v.findViewById(R.id.tv_content);TextView tv_time = (TextView) v.findViewById(R.id.tv_time);//Set text for TextViewString allText = noteList.get(position).getContent();/*if (sharedPreferences.getBoolean("noteTitle" ,true))tv_content.setText(allText.split("\n")[0]);*/tv_content.setText(allText);tv_time.setText(noteList.get(position).getTime());//Save note id to tagv.setTag(noteList.get(position).getId());return v;}@Overridepublic Filter getFilter() {if (mFilter == null) {mFilter = new MyFilter();}return mFilter;}class MyFilter extends Filter {//在performFiltering(CharSequence charSequence)这个方法中定义过滤规则@Overrideprotected FilterResults performFiltering(CharSequence charSequence) {FilterResults result = new FilterResults();List<Note> list;if (TextUtils.isEmpty(charSequence)) {//当过滤的关键字为空的时候,我们则显示所有的数据list = backList;} else {//否则把符合条件的数据对象添加到集合中list = new ArrayList<>();for (Note note : backList) {if (note.getContent().contains(charSequence)) {list.add(note);}}}result.values = list; //将得到的集合保存到FilterResults的value变量中result.count = list.size();//将集合的大小保存到FilterResults的count变量中return result;}//在publishResults方法中告诉适配器更新界面@Overrideprotected void publishResults(CharSequence charSequence, FilterResults filterResults) {noteList = (List<Note>) filterResults.values;if (filterResults.count > 0) {notifyDataSetChanged();//通知数据发生了改变} else {notifyDataSetInvalidated();//通知数据失效}}}
}

NoteDatabase

用到的是SQLite数据库,Android自带了一种轻量级数据库,使用非常方便。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class NoteDatabase extends SQLiteOpenHelper {public static final String TABLE_NAME = "notes";public static final String CONTENT = "content";public static final String ID = "_id";public static final String TIME = "time";public static final String MODE = "mode";public NoteDatabase(Context context) {super(context, "notes", null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE " + TABLE_NAME+ "("+ ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ CONTENT + " TEXT NOT NULL,"+ TIME + " TEXT NOT NULL,"+ MODE + " INTEGER DEFAULT 1)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

EditNoteActivity

编辑页面的Activity

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.KeyEvent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import java.text.SimpleDateFormat;
import java.util.Date;public class EditNoteActivity extends BaseActivity {private EditText et;private Toolbar myToolbar;private String old_content = "";private String old_time = "";private int old_Tag = 1;private long id = 0;private int openMode = 0;private int tag = 1;public Intent intent = new Intent(); // message to be sentprivate boolean tagChange = false;private final String TAG = "tag";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_edit_note);myToolbar = findViewById(R.id.my_Toolbar);setSupportActionBar(myToolbar);getSupportActionBar().setHomeButtonEnabled(true);getSupportActionBar().setDisplayHomeAsUpEnabled(true); //设置toolbar取代actionbarmyToolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {autoSetMessage();setResult(RESULT_OK, intent);finish();}});et = findViewById(R.id.et);Intent getIntent = getIntent();openMode = getIntent.getIntExtra("mode", 0);if (openMode == 3) {//打开已存在的noteid = getIntent.getLongExtra("id", 0);old_content = getIntent.getStringExtra("content");old_time = getIntent.getStringExtra("time");old_Tag = getIntent.getIntExtra("tag", 1);et.setText(old_content);et.setSelection(old_content.length());}}public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_HOME) {return true;} else if (keyCode == KeyEvent.KEYCODE_BACK) {autoSetMessage();setResult(RESULT_OK, intent);finish();return true;}return super.onKeyDown(keyCode, event);}public String dateToStr() {Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.format(date);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.delete:new AlertDialog.Builder(EditNoteActivity.this).setMessage("删除吗?").setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (openMode == 4) { // new noteintent.putExtra("mode", -1);setResult(RESULT_OK, intent);} else { // existing noteintent.putExtra("mode", 2);intent.putExtra("id", id);setResult(RESULT_OK, intent);}finish();}}).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).create().show();break;}return super.onOptionsItemSelected(item);}public void autoSetMessage() {if (openMode == 4) {if (et.getText().toString().length() == 0) {intent.putExtra("mode", -1); //nothing new happens.} else {intent.putExtra("mode", 0); // new one note;intent.putExtra("content", et.getText().toString());intent.putExtra("time", dateToStr());intent.putExtra("tag", tag);}} else {if (et.getText().toString().equals(old_content) && !tagChange)intent.putExtra("mode", -1); // edit nothingelse {intent.putExtra("mode", 1); //edit the contentintent.putExtra("content", et.getText().toString());intent.putExtra("time", dateToStr());intent.putExtra("id", id);intent.putExtra("tag", tag);}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.edit_menu, menu);return super.onCreateOptionsMenu(menu);}
}

CRUD

对SQLite数据库增删改查操作,增加、删除、修改、查询记事信息

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 CRUD {SQLiteOpenHelper dbHandler;SQLiteDatabase db;private static final String[] columns = {NoteDatabase.ID,NoteDatabase.CONTENT,NoteDatabase.TIME,NoteDatabase.MODE};public CRUD(Context context){dbHandler = new NoteDatabase(context);}public void open(){db = dbHandler.getWritableDatabase();}public void close(){dbHandler.close();}//把note 加入到database里面public Note addNote(Note note){//add a note object to databaseContentValues contentValues = new ContentValues();contentValues.put(NoteDatabase.CONTENT, note.getContent());contentValues.put(NoteDatabase.TIME, note.getTime());contentValues.put(NoteDatabase.MODE, note.getTag());long insertId = db.insert(NoteDatabase.TABLE_NAME, null, contentValues);note.setId(insertId);return note;}public Note getNote(long id){//get a note from database using cursor indexCursor cursor = db.query(NoteDatabase.TABLE_NAME,columns,NoteDatabase.ID + "=?",new String[]{String.valueOf(id)},null,null, null, null);if (cursor != null) cursor.moveToFirst();Note e = new Note(cursor.getString(1),cursor.getString(2), cursor.getInt(3));return e;}public List<Note> getAllNotes(){Cursor cursor = db.query(NoteDatabase.TABLE_NAME,columns,null,null,null, null, null);List<Note> notes = new ArrayList<>();if(cursor.getCount() > 0){while(cursor.moveToNext()){Note note = new Note();note.setId(cursor.getLong(cursor.getColumnIndex(NoteDatabase.ID)));note.setContent(cursor.getString(cursor.getColumnIndex(NoteDatabase.CONTENT)));note.setTime(cursor.getString(cursor.getColumnIndex(NoteDatabase.TIME)));note.setTag(cursor.getInt(cursor.getColumnIndex(NoteDatabase.MODE)));notes.add(note);}}return notes;}public int updateNote(Note note) {//update the info of an existing noteContentValues values = new ContentValues();values.put(NoteDatabase.CONTENT, note.getContent());values.put(NoteDatabase.TIME, note.getTime());values.put(NoteDatabase.MODE, note.getTag());// updating rowreturn db.update(NoteDatabase.TABLE_NAME, values,NoteDatabase.ID + "=?",new String[] { String.valueOf(note.getId())});}public void removeNote(Note note) {//remove a note according to ID valuedb.delete(NoteDatabase.TABLE_NAME, NoteDatabase.ID + "=" + note.getId(), null);}}

结果

基于Java实现一个简单的记事本Android App相关推荐

  1. 基于Java实现一个简单的YACC

    资源下载地址:https://download.csdn.net/download/sheziqiong/86918785 资源下载地址:https://download.csdn.net/downl ...

  2. python相关毕设题目_基于java的一个有创意的web毕设题目

    基于java的一个有创意的web毕设题目 一个有创意的web毕设题目 本课题将结合基于Java Web技术的名师一对一课程预约系统,根据本课题的最终目标,在线用户注册.相关信息发布.在线咨询.预约试听 ...

  3. Android——一个简单的记账本APP

    一个简单的记账本APP 视频效果预览 添加账目记录 效果预览 添加账目记录实现 简述 实现 获取日期 字符串时间戳转Date Date转星期 获取时间 Switch控制显示和隐藏 更改Switch样式 ...

  4. 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ

    文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...

  5. 基于Java Swing实现的日历记事本系统【源码+报告文档】

    一.项目简介 本项目是一套基于Java Swing实现的日历记事本系统,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者. 包含:项目源码.报告文档等. 项目都经过严格 ...

  6. Java写个简单的记事本()

    一个简单的记事本,功能不太全 直接放代码了 import java.awt.*; //抽象窗口 import java.awt.event.*; //窗口事件 import java.io.*; // ...

  7. 基于Java设计一个短链接生成系统

    相信大家在生活中会收到很多短信,而这些短信都有一个特点是链接很短.这些链接背后的原理是什么呢?怎么实现的?小编今天就带你们详细了解一下 我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接, ...

  8. 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  9. 如何用Java设计一个简单的窗口界面(学习中.1)

    如何用Java设计一个简单的窗口界面 一.前言 二.简单了解 1.Swing简介 2.框架(frame) 3.层次 三.步骤 1.打开eclipse,依次创建项目,包,类. 2.代码 2.1最简单的可 ...

  10. java编写存钱_用Java编写一个简单的存款

    package desposit.money; public class DespositMoney { public static void main(String[] args) { Custom ...

最新文章

  1. Flutter——设置appBar的高度
  2. 不确定函数参数个数时的处理,va_start和va_end使用详解
  3. KVM 安装windows 虚拟机
  4. 信息系统项目管理师-信息文档与配置管理核心知识点思维脑图
  5. 发布会预告 | 多账号管控与网络安全集中化管理能力升级
  6. 一条查询SQL 语句是如何执行的?
  7. 3、数据库的事务、并发和锁机制
  8. 用python画熊猫_熊猫read_excel()–用Python读取Excel文件
  9. 打开qq农场外挂显示无法与服务器同步,稍后再试是怎么回事啊,qq农场为什么打不开...
  10. 自己制作并发布720°VR全景图
  11. Unity利用Input类实现摄像机镜头拉近与拉远
  12. 兔子会死怎么办? 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔子会死
  13. cad2016中选择全图字体怎么操作_cad教程分享CAD如何替换找不到的原文字体?
  14. IntelliJ IDEA 永久破解
  15. 关于求矩阵主对角线元素之和及副对角线元素之和的问题
  16. Android App加载图片内存空间计算
  17. 学习云计算哪里好?云计算新的前景出路
  18. 联通大数据携U10峰会而来……
  19. 物联网通信-末端监控点环网组网设计
  20. 学密码学一定得学程序(SDUT 2463)

热门文章

  1. Clustering - Choosing the number of clusters
  2. 单目标跟踪——常用数据集和指标
  3. Unity Timeline 初识
  4. vue-cli项目代理proxyTable配置exclude的方法
  5. mysql网游单机架设_网游单机架设直观教程终结版.doc
  6. 我过去的那些编程思想
  7. 安全测试(五)Android APK软件安全 APP应用安全 手机软件安全 apk安全 apk反编译 应用日志窃取 apk漏洞 应用软件本身功能漏洞 高危权限泄密风险等 移动应用常规安全讲解
  8. mvc html禁用文本框,如何在MVC htmlAttribute中設置禁用
  9. RabbitMQ是什么?一些简单的概念
  10. 英文学术写作:十个语言风格上应注意的点(书摘)