Android小项目——简易备忘录的实现
简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除。在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等
文章目录
前言
简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除。在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等
一、主界面UI及功能
主要功能介绍
- 单击加号图标可以新建一个备忘录并跳转到编辑页面
- 单击备忘录列表中的子项,可以进入已保存备忘录页面对备忘录内容进行修改
- 长按备忘录列表中的子项,可以对该条备忘录进行选择性删除
主界面的xml代码
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FDF5E6">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:text="备忘录"
android:textSize="22sp"/>
<ImageView
android:id="@+id/img_add"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_marginTop="8dp"
android:layout_marginRight="20dp"
android:src="@drawable/add"
android:padding="5dp"
/>
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/memo_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp" />
</LinearLayout>
主界面的java代码
package test_5;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.SyncStateContract;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.test.R;
import org.litepal.crud.DataSupport;
import org.litepal.exceptions.DataSupportException;
import org.litepal.tablemanager.Connector;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import static com.example.test.R.id.img_add;
public class MainActivity extends AppCompatActivity {
private ArrayList <Integer> memoId = new ArrayList<>();
private List<Memo> mMemoList;
@BindView(R.id.img_add)
ImageView mAddImage;
@BindView(R.id.memo_list)
RecyclerView mDataList;
private static final String TAG = "MainActivity";
private MemoAdapter mMemoDataAdapter;
private String mTitle;
private String mBody;
private String mCreateTime;
private String mValues;
private String mModifyTime;
private String mIsTipsChecked;
//设置点击事件,点击图片跳转至编辑页面
@OnClick({
R.id.img_add})
public void onClicked() {
Intent intent = new Intent(MainActivity.this, EditActivity.class);
startActivity(intent);
}
//点击item,编辑已有内容的备忘录
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ButterKnife.bind(this);
initView();
initData();
initEvent();
}
//初始化数据
private void initData() {
//获取数据库里的内容
mMemoList = new ArrayList<>();
mMemoList = DataSupport.findAll(Memo.class);
for (Memo memo: mMemoList) {
Memo mMemo = new Memo();
int id = memo.getId();
mMemo.setId(id);
memoId.add(id);
mMemo.setTitle(memo.getTitle());
mMemo.setText(memo.getText());
mMemo.setCreateTime(memo.getCreateTime());
mMemo.setTipsChecked(memo.isTipsChecked());
}
mMemoDataAdapter.setData(mMemoList);
}
private void initEvent() {
//点击图标跳转到编辑页面
mAddImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, EditActivity.class);
startActivity(intent);
}
});
//点击item跳转到编辑页面
mMemoDataAdapter.setOnItemClickLinstener(new MemoAdapter.OnItemClickLinstener() {
@Override
public void onClick(int position, String title, String body, boolean tipsChecked) {
Toast.makeText(MainActivity.this, "clicked..." + position, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, AmendActivity.class);
//将数据显示在AmendActivity中
Bundle bundle = new Bundle();
bundle.putInt(Constants.MEMO_ID, position + 1);
bundle.putString(Constants.MEMO_TITLE, title);
bundle.putString(Constants.MEMO_BODY, body);
bundle.putBoolean(Constants.MEMO_NEED_TIPS, tipsChecked);
intent.putExtras(bundle);
startActivity(intent);
}
});
//长按item删除
mMemoDataAdapter.setOnItemLongClickLinstener(new MemoAdapter.OnItemLongClickListener() {
@Override
public void onLongClick(int position, String title, String body) {
Toast.makeText(MainActivity.this, "long click", Toast.LENGTH_SHORT).show();
//提示dialog
Memo mMemo = new Memo();
mMemo.setTitle(title);
mMemo.setText(body);
Integer currentId = memoId.get(position);
mMemo.setId(currentId);
showDialog(position, mMemo);
}
});
}
// 提示dialog是否删除该记录
private void showDialog(final int position, final Memo record) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("提示:");
dialog.setMessage("是否删除当前记录(添加的提醒事件将会同时被删除)");
dialog.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//删除数据库中的记录
doDelete(position, record);
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//停留在当前页面
Toast.makeText(MainActivity.this, "已取消删除", Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
//删除数据库中的记录
// 同时删除提醒事件
public void doDelete(int position, Memo record) {
int currentMemoId = record.getId();
Log.d(TAG, "currente memo id is " + currentMemoId);
Log.d(TAG, "currente memo position is " + position);
//memo.db删除数据
DataSupport.deleteAll(Memo.class, "id = ?", "currentMemoId");
//列表中删除该记录
mMemoDataAdapter.removeItem(position);
//判断是否删除提醒事件
boolean tipsChecked = record.isTipsChecked();
Log.d(TAG, "tipsChecked" + tipsChecked);
if (tipsChecked) {
//删除提醒事件
//可以获取到备忘录的title和body
String deleteTitle = record.getTitle();
//根据title和body查询calendar中的id
queryPosition(deleteTitle);
}
//更新数据/ui
mDataList.post(new Runnable() {
@Override
public void run() {
mMemoDataAdapter.notifyDataSetChanged();
}
});
}
private void queryPosition(String deleteTitle) {
//遍历calendar的数据库来找到对应memo的id
//查询事件
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.android.calendar/events");
Cursor cursor = contentResolver.query(uri, new String[]{
CalendarContract.Events._ID}, CalendarContract.Events.TITLE + "=" + deleteTitle, null, null, null);
String[] columnNames = cursor.getColumnNames();
while (cursor.moveToNext()) {
for (String columnName : columnNames) {
mValues = cursor.getString(cursor.getColumnIndex(columnName));
Log.d(TAG, columnName + "==" + mValues);
}
}
long deleteEventId = Integer.parseInt(mValues);
Log.d(TAG, "deleteEventId is " + deleteEventId);
cursor.close();
//根据ID删除calendar表中的数据
if (deleteEventId != 0) {
Uri deleteEventUri = ContentUris.withAppendedId(Uri.parse("content://com.android.calendar/events"), deleteEventId);
getContentResolver().delete(deleteEventUri, null, null);
}
}
//初始化控件
private void initView() {
//数据列表
mDataList = findViewById(R.id.memo_list);
//recyclerview的基本设置
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
linearLayoutManager.setStackFromEnd(true);
linearLayoutManager.setReverseLayout(true);
mDataList.setLayoutManager(linearLayoutManager);
mMemoDataAdapter = new MemoAdapter();
mDataList.setAdapter(mMemoDataAdapter);
//创建数据库
Connector.getDatabase();
}
}
二、新建备忘录页面
主要功能介绍
- 单击返回图标可以返回主界面
- 在标题输入框可以输入备忘录标题
- 在内容输入区域可以输入备忘录内容
- 点击图片图标可以进行图片插入(此功能目前有bug,点击即程序闪退)
- 点击“是否设置提醒”的checkbox,则可以设置备忘录提醒的日期和时间
- 点击保存按钮即可对备忘录内容进行保存,并跳转到主界面
- 点击清空按钮即可清空备忘录内容
页面布局:
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"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FDF5E6">
<ImageView
android:id="@+id/btn_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:src="@drawable/back"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="备忘录"
android:textSize="22sp"/>
</RelativeLayout>
<TextView
android:id="@+id/edit_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="8dp"
android:text="当前时间"
android:textSize="15sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="标题"
android:textSize="15sp"
android:gravity="center"/>
<EditText
android:id="@+id/edit"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content"
android:hint="输入标题"
android:textSize="15sp"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_marginTop="10dp"
android:background="#FFFFF0"
android:gravity="start"
android:hint="在此输入内容"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/content"
android:layout_marginLeft="8dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/insert_image_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/picture"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上传图片"
android:textSize="12sp"/>
</LinearLayout>
<ImageView
android:id="@+id/image_picker_one"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="16dp"
android:src="@drawable/ic_launcher_foreground"
android:visibility="gone" />
<ImageView
android:id="@+id/image_picker_two"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="16dp"
android:src="@drawable/ic_launcher_foreground"
android:visibility="gone" />
<ImageView
android:id="@+id/image_picker_three"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="16dp"
android:src="@drawable/ic_launcher_foreground"
android:visibility="gone" />
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/memo_is_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="是否设置提醒"/>
<TextView
android:id="@+id/check_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="请选择日期"
android:visibility="gone"/>
<TextView
android:id="@+id/check_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="请选择时间"
android:visibility="gone"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<Button
android:id="@+id/btn_save"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="50dp"
android:background="#FFFFF0"
android:text="保存"/>
<Button
android:id="@+id/btn_clean"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="50dp"
android:background="#FFFFF0"
android:text="清空"/>
</RelativeLayout>
</LinearLayout>
java代码
package test_5;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.test.R;
import org.litepal.tablemanager.Connector;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone