Android小项目——简易备忘录的实现

简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除。在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等


文章目录

    • Android小项目——简易备忘录的实现
  • 前言
  • 一、主界面UI及功能
    • 主要功能介绍
    • 主界面的xml代码
    • 主界面的java代码
  • 二、新建备忘录页面
    • 主要功能介绍
    • xml代码
    • java代码
  • 三、编辑已保存备忘录页面
    • 主要功能介绍
    • xml代码
    • JAVA代码
  • 四、数据存储
  • 五、实体类——Memo
  • 总结

前言

简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除。在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等


一、主界面UI及功能

主要功能介绍

  • 单击加号图标可以新建一个备忘录并跳转到编辑页面
  • 单击备忘录列表中的子项,可以进入已保存备忘录页面对备忘录内容进行修改
  • 长按备忘录列表中的子项,可以对该条备忘录进行选择性删除

主界面的xml代码

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FDF5E6"><TextViewandroid: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"/><ImageViewandroid: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.RecyclerViewandroid: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,编辑已有内容的备忘录@Overrideprotected 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() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, EditActivity.class);startActivity(intent);}});//点击item跳转到编辑页面mMemoDataAdapter.setOnItemClickLinstener(new MemoAdapter.OnItemClickLinstener() {@Overridepublic 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() {@Overridepublic void onLongClick(int position, String title, String body) {Toast.makeText(MainActivity.this, "long click", Toast.LENGTH_SHORT).show();//提示dialogMemo 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {//删除数据库中的记录doDelete(position, record);}});dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic 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和bodyString deleteTitle = record.getTitle();//根据title和body查询calendar中的idqueryPosition(deleteTitle);}//更新数据/uimDataList.post(new Runnable() {@Overridepublic 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"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FDF5E6"><ImageViewandroid:id="@+id/btn_back"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:src="@drawable/back"/><TextViewandroid: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><TextViewandroid: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"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="标题"android:textSize="15sp"android:gravity="center"/><EditTextandroid:id="@+id/edit"android:layout_width="0dp"android:layout_weight="3"android:layout_height="wrap_content"android:hint="输入标题"android:textSize="15sp"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="400dp"android:layout_marginTop="10dp"android:background="#FFFFF0"android:gravity="start"android:hint="在此输入内容"/><LinearLayoutandroid: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"><LinearLayoutandroid:id="@+id/insert_image_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="vertical"><ImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/picture"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="上传图片"android:textSize="12sp"/></LinearLayout><ImageViewandroid: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" /><ImageViewandroid: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" /><ImageViewandroid: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><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><CheckBoxandroid:id="@+id/memo_is_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="是否设置提醒"/><TextViewandroid:id="@+id/check_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="请选择日期"android:visibility="gone"/><TextViewandroid:id="@+id/check_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="请选择时间"android:visibility="gone"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><Buttonandroid:id="@+id/btn_save"android:layout_width="120dp"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:background="#FFFFF0"android:text="保存"/><Buttonandroid: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;import butterknife.BindView;
import butterknife.ButterKnife;import static test_5.MyTimeFormat.getTimeStr;
import static test_5.MyTimeFormat.myDateFormat;public class EditActivity extends AppCompatActivity implements ImagePickerConfig.OnImageSelectedFinishLisenter {@BindView(R.id.btn_back)ImageView mBackBtn;@BindView(R.id.content)EditText mContextEv;@BindView(R.id.btn_save)Button mSaveBtn;@BindView(R.id.btn_clean)Button mCleanBtn;@BindView(R.id.edit)EditText mMomeTitle;@BindView(R.id.edit_time)TextView mEditTime;@BindView(R.id.memo_is_time)CheckBox mIsTip;@BindView(R.id.check_data)TextView mTipsDate;@BindView(R.id.check_time)TextView mTipsTime;@BindView(R.id.insert_image_btn)View mInsertImageBtn;@BindView(R.id.image_picker_one)ImageView mImageViewOne;@BindView(R.id.image_picker_two)ImageView mImageViewTwo;@BindView(R.id.image_picker_three)ImageView mImageViewThree;private static final String TAG = "EditActivity";private static final int PREMISSION_REQUEST_CODE = 1;private static final int MAX_SELECTED_COUNT = 3;private Integer year;private Integer month;private Integer dayOfMonth;private Integer hour;private Integer minute;private DatePickerDialog dialogDate;private TimePickerDialog dialogTime;private String mCreateDate;private String mDispCreateDate;private int mYear;private int mMonth;private int mDay;private Calendar mCalendar;private int mHour;private int mMinute;private int mSecond;private boolean mTipIsChecked;//动态获取权限时的请求码private static final int PERMISSION_REQUEST_CODE = 1;private long mEventId;private int mMyHourOfDay;private int mMyMinute;private int mMyDayOfMonth;private int mMyYear;private int mMyMonth;private String mTitle;private String mBody;public int mSelectedSize;private ImagePickerConfig mPickerConfig;@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.edit_activity);ButterKnife.bind(this);checkCalendarPermission();checkImagePermission();getDate();initCalendar();initView();initEvent();initPickerConfig();}private void initPickerConfig() {mPickerConfig = ImagePickerConfig.getInstance();mPickerConfig.setMaxSelectedCount(MAX_SELECTED_COUNT);mPickerConfig.setOnImageSelectedFinishLisenter(this);}//检查是否有读写相册权限@RequiresApi(api = Build.VERSION_CODES.M)private void checkImagePermission() {int readExStroagePresmission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);Log.d(TAG, "readExStroagePresmission" + readExStroagePresmission);if (readExStroagePresmission == PackageManager.PERMISSION_GRANTED) {//有权限} else {//没有权限,需要去申请权限requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PREMISSION_REQUEST_CODE);}}//查询日历,验证URL@RequiresApi(api = Build.VERSION_CODES.M)private void queryCalender() {ContentResolver contentResolver = getContentResolver();Uri uri = CalendarContract.Calendars.CONTENT_URI;if (checkSelfPermission(Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {return;}Cursor query = contentResolver.query(uri, null, null, null, null);String[] columnNames = query.getColumnNames();for (String columnName : columnNames) {Log.d(TAG, "columnName -- > " + columnName);}query.close();}//创建日历用户private void initCalendar() {TimeZone timeZone = TimeZone.getDefault();ContentValues value = new ContentValues();value.put(CalendarContract.Calendars.NAME, "yy");value.put(CalendarContract.Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com");value.put(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange");value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "mytt");value.put(CalendarContract.Calendars.VISIBLE, 1);value.put(CalendarContract.Calendars.CALENDAR_COLOR, -9206951);value.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);value.put(CalendarContract.Calendars.SYNC_EVENTS, 1);value.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID());value.put(CalendarContract.Calendars.OWNER_ACCOUNT, "mygmailaddress@gmail.com");value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0);Uri calendarUri = CalendarContract.Calendars.CONTENT_URI;calendarUri = calendarUri.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true").appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com").appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange").build();getContentResolver().insert(calendarUri, value);}//检查是否获取日历的读写权限@RequiresApi(api = Build.VERSION_CODES.M)private void checkCalendarPermission() {int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);if (writePermission == PackageManager.PERMISSION_GRANTED && readPermission == PackageManager.PERMISSION_GRANTED) {//有读写日历的权限Log.d(TAG, "has permission...");} else {//没有权限//需要获取权限Log.d(TAG, "no permission...");requestPermissions(new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR}, PERMISSION_REQUEST_CODE);}}//判断请求码结果来决定是否能成功获取权限@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == PERMISSION_REQUEST_CODE) {//权限检查的结果if (grantResults.length == 3 &&grantResults[0] == PackageManager.PERMISSION_GRANTED &&grantResults[1] == PackageManager.PERMISSION_GRANTED &&grantResults[2] == PackageManager.PERMISSION_GRANTED) {//此时有权限Toast.makeText(this, "有权限", Toast.LENGTH_SHORT).show();} else {//此时没有权限//可以给出一个提示://用户点击确定后重新调用请求权限//用户点击取消后就不再获取权限了finish();Toast.makeText(this, "没有权限", Toast.LENGTH_SHORT).show();}}}//获取当前时间private void getDate() {mCalendar = Calendar.getInstance();mYear = mCalendar.get(Calendar.YEAR);mMonth = mCalendar.get(Calendar.MONTH);mDay = mCalendar.get(Calendar.DAY_OF_MONTH);mHour = mCalendar.get(java.util.Calendar.HOUR_OF_DAY);mMinute = mCalendar.get(java.util.Calendar.MINUTE);mSecond = mCalendar.get(java.util.Calendar.SECOND);}//点击事件private void initEvent() {//返回mBackBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取输入内容String title = mMomeTitle.getText().toString().trim();String body = mContextEv.getText().toString().trim();if (!title.equals("") && !body.equals("")) {//如果标题,内容都不为空,则显示dialogshowDialog(title, body);} else {//如果都为空则返回startIntent();}}});//保存mSaveBtn.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.M)@Overridepublic void onClick(View v) {//获取输入内容mTitle = mMomeTitle.getText().toString().trim();mBody = mContextEv.getText().toString().trim();Log.d(TAG, "title is " + mTitle);Log.d(TAG, "body is " + mBody);if (canDoSave(mTitle, mBody)) {saveInToDb(mTitle, mBody);if (mTipIsChecked) {Toast.makeText(EditActivity.this, "保存成功", Toast.LENGTH_SHORT).show();setTipIntoCalendar();startIntent();} else {startIntent();}}}});mCleanBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mContextEv.setText(" ");}});//是否设置提醒事件,checkbox是否被选中mIsTip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {mTipIsChecked = isChecked;Log.d(TAG, "mChecked" + isChecked);if (isChecked) {//选择设置提醒的话就选择时间mTipsDate.setVisibility(View.VISIBLE);} else {//无法设置提醒mTipsDate.setVisibility(View.GONE);mTipsTime.setVisibility(View.GONE);}}});//选择事件日期mTipsDate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(EditActivity.this, "1111", Toast.LENGTH_SHORT).show();//选择事件时间showDatePickerDialog();//设置time为可见mTipsTime.setVisibility(View.VISIBLE);}});//选择提醒时间mTipsTime.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//选择时间showTimePickerDialog();}});//插入图片被点击了,跳转到picker界面mInsertImageBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(EditActivity.this, PickerActivity.class));}});}//设置提醒时间private void showTimePickerDialog() {TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {//记录下当前选择的时间,设置到提醒事件中去mMyHourOfDay = hourOfDay;mMyMinute = minute;mTipsTime.setText(hourOfDay + ":" + minute);}};TimePickerDialog dialog = new TimePickerDialog(this, 0, listener, mHour, mMinute, true);dialog.show();}//设置事件日期private void showDatePickerDialog() {DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {//显示设置的会见//记录下当前所选的日子,设置到提醒事件中去mMyYear = year;mMyMonth = ++month;mMyDayOfMonth = dayOfMonth;mTipsDate.setText(year + "-" + mMyMonth + "-" + dayOfMonth);}};DatePickerDialog datePickerDialog = new DatePickerDialog(this, 0, listener, mYear, mMonth, mDay);datePickerDialog.show();}//将内容保存到数据库private void saveInToDb(String title, String body) {Memo mMemo = new Memo();mMemo.setTitle(title);mMemo.setText(body);mMemo.setCreateTime(mDispCreateDate);mMemo.setTipsChecked(mTipIsChecked);mMemo.save();}//向日历中插入提醒事件@RequiresApi(api = Build.VERSION_CODES.M)private void setTipIntoCalendar() {//插入事件//前面查询出来的long calID = 1;//时间创建java.util.Calendar beginTime = java.util.Calendar.getInstance();//Month value is 0-based. e.g., 0 for January.//开始时间int month = mMyMonth - 1;beginTime.set(mMyYear, month, mMyDayOfMonth, mMyHourOfDay, mMyMinute);long startMillis = beginTime.getTimeInMillis();java.util.Calendar endTime = java.util.Calendar.getInstance();//结束时间endTime.set(mMyYear, month, mMyDayOfMonth, mMyHourOfDay, mMyMinute + 45);long endMillis = endTime.getTimeInMillis();Log.d(TAG, "beginTime -- > " + mMyYear + "-" + month + "-" + mMyDayOfMonth + "-" + mMyHourOfDay + "-" + mMyMinute);Log.d(TAG, "endTime -- > " + mMyYear + "-" + month + "-" + mMyDayOfMonth + "-" + mMyHourOfDay + "-" + mMyMinute + 45);//准备好插入事件数据库的内容ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();//开始时间values.put(CalendarContract.Events.DTSTART, startMillis);//结束时间values.put(CalendarContract.Events.DTEND, endMillis);//标题values.put(CalendarContract.Events.TITLE, mTitle);//描述values.put(CalendarContract.Events.DESCRIPTION, mBody);//日历IDvalues.put(CalendarContract.Events.CALENDAR_ID, calID);//时间时区String timeZone = TimeZone.getDefault().getID();Log.d(TAG, "time zone -- > " + timeZone);values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {return;}Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);Log.d(TAG, "insert result --- > " + uri);//插入提醒//获取当前插入事件的IDString strUri = String.valueOf(uri);String currentId = strUri.replace("content://com.android.calendar/events/", "");mEventId = Integer.valueOf(currentId);ContentValues remindValues = new ContentValues();//15分钟前进行提醒remindValues.put(CalendarContract.Reminders.MINUTES, 15);remindValues.put(CalendarContract.Reminders.EVENT_ID, mEventId);remindValues.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);Uri reminduri = cr.insert(CalendarContract.Reminders.CONTENT_URI, remindValues);Log.d(TAG, "result uri -- > " + reminduri);}//判断能否保存private boolean canDoSave(String title, String body) {//用于判断能否进行保存动作//true:此时说明可以保存内容,保存内容至数据库中//flase:不能保存,需要写内容boolean flag = true;if (title.equals("")) {Toast.makeText(this, "标题不能为空", Toast.LENGTH_SHORT).show();flag = false;}if (title.length() > 10) {Toast.makeText(this, "标题过长", Toast.LENGTH_SHORT).show();flag = false;}if (body.length() > 200) {Toast.makeText(this, "内容过长", Toast.LENGTH_SHORT).show();flag = false;}if (body.equals("")) {Toast.makeText(this, "内容不能为空", Toast.LENGTH_SHORT).show();flag = false;}if (mTipIsChecked) {//如果选中“添加提醒事件”,就需要将日期时间填写完整才可以if (mTipsDate.getText().toString().equals("请选择日期") || mTipsTime.getText().toString().equals("请选择时间")) {Toast.makeText(this, "日期/时间不能为空", Toast.LENGTH_SHORT).show();flag = false;}}return flag;}//显示dialogprivate void showDialog(final String title, final String body) {AlertDialog.Builder dialog = new AlertDialog.Builder(EditActivity.this);dialog.setTitle("提示:");dialog.setMessage("是否保存当前内容");dialog.setPositiveButton("保存", new DialogInterface.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.M)@Overridepublic void onClick(DialogInterface dialog, int which) {Log.d(TAG, "保存");//将数据保存至数据库,设置提醒事件if (canDoSave(title, body)) {saveInToDb(title, body);if (mTipIsChecked) {setTipIntoCalendar();startIntent();} else {startIntent();}}}});dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//停留在当前页面Log.d(TAG, "取消");}});dialog.show();}//页面跳转private void startIntent() {Intent intent = new Intent(EditActivity.this, MainActivity.class);startActivity(intent);}//初始化操作private void initView() {//初始化当前时间Date date = new Date(System.currentTimeMillis());//创建的时间,存入数据库,数据库根据时间先后显示列表mCreateDate = myDateFormat(date, DateFormat.NORMAL_TIME);mDispCreateDate = getTimeStr(date);if (mEditTime.getText().length() != 0) {mEditTime.setText(mDispCreateDate);}dialogDate = null;dialogTime = null;hour = 0;minute = 0;year = 0;month = 0;dayOfMonth = 0;//初始化数据库Connector.getDatabase();}@Overridepublic void onSelectedFinish(List<ImageItem> selectedResult) {//所选择的图片列表在该处回来了for (ImageItem imageItem : selectedResult) {Log.d(TAG, "image item is " + imageItem);}mSelectedSize = selectedResult.size();Log.d(TAG, "selected size is " + mSelectedSize);mPickerConfig.setSelectResult(selectedResult);mPickerConfig.setSeletcedSize(mSelectedSize);setPics(selectedResult);}private void setPics(List<ImageItem> selectedResult) {switch (mSelectedSize) {case 1:Glide.with(mImageViewOne.getContext()).load(selectedResult.get(0).getPath()).into(mImageViewOne);mImageViewOne.setVisibility(View.VISIBLE);mImageViewTwo.setVisibility(View.GONE);mImageViewThree.setVisibility(View.GONE);break;case 2:Glide.with(mImageViewOne.getContext()).load(selectedResult.get(0).getPath()).into(mImageViewOne);Glide.with(mImageViewTwo.getContext()).load(selectedResult.get(1).getPath()).into(mImageViewTwo);mImageViewOne.setVisibility(View.VISIBLE);mImageViewTwo.setVisibility(View.VISIBLE);mImageViewThree.setVisibility(View.GONE);break;case 3:Glide.with(mImageViewOne.getContext()).load(selectedResult.get(0).getPath()).into(mImageViewOne);Glide.with(mImageViewTwo.getContext()).load(selectedResult.get(1).getPath()).into(mImageViewTwo);Glide.with(mImageViewThree.getContext()).load(selectedResult.get(2).getPath()).into(mImageViewThree);mImageViewOne.setVisibility(View.VISIBLE);mImageViewTwo.setVisibility(View.VISIBLE);mImageViewThree.setVisibility(View.VISIBLE);break;}}
}

三、编辑已保存备忘录页面

主要功能介绍

与编辑页面功能一致

xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FDF5E6"><ImageViewandroid:id="@+id/amend_btn_back"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:src="@drawable/back"/><TextViewandroid: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><TextViewandroid:id="@+id/amend_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"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="标题"android:textSize="15sp"android:gravity="center"/><EditTextandroid:id="@+id/amend_edit"android:layout_width="0dp"android:layout_weight="3"android:layout_height="wrap_content"android:hint="输入标题"android:textSize="15sp"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/amend_content"android:layout_width="match_parent"android:layout_height="400dp"android:layout_marginTop="10dp"android:gravity="start"android:hint="在此输入内容"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignBottom="@id/amend_content"android:layout_marginLeft="8dp"android:layout_marginBottom="8dp"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/amend_insert_image_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="vertical"><ImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/picture"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="上传图片"android:textSize="12sp"/></LinearLayout><ImageViewandroid:id="@+id/amend_pic_one"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginLeft="20dp"android:src="@drawable/ic_launcher_foreground"android:visibility="gone" /><ImageViewandroid:id="@+id/amend_pic_two"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginLeft="20dp"android:src="@drawable/ic_launcher_foreground"android:visibility="gone" /><ImageViewandroid:id="@+id/amend_pic_three"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginLeft="20dp"android:src="@drawable/ic_launcher_foreground"android:visibility="gone" /></LinearLayout></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><CheckBoxandroid:id="@+id/amend_memo_is_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="是否设置提醒"/><TextViewandroid:id="@+id/amend_check_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="请选择日期"android:visibility="gone"/><TextViewandroid:id="@+id/amend_check_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:text="请选择时间"android:visibility="gone"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><Buttonandroid:id="@+id/amend_btn_save"android:layout_width="120dp"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:background="#FFFFF0"android:text="保存"/><Buttonandroid:id="@+id/amend_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.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.app.slice.Slice;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.graphics.ColorSpace;
import android.net.Uri;
import android.os.Build;
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.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.crud.DataSupport;
import org.litepal.tablemanager.Connector;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;import butterknife.BindView;
import butterknife.ButterKnife;import static test_5.MyTimeFormat.getTimeStr;public class AmendActivity extends AppCompatActivity implements ImagePickerConfig.OnImageSelectedFinishLisenter{@BindView(R.id.amend_btn_back)ImageView mBackBtn;@BindView(R.id.amend_edit_time)TextView mCurrentTime;@BindView(R.id.amend_edit)EditText mTitle;@BindView(R.id.amend_content)EditText mContent;@BindView(R.id.amend_memo_is_time)CheckBox mCheckBox;@BindView(R.id.amend_check_data)TextView mDataPicker;@BindView(R.id.amend_check_time)TextView mTimePicker;@BindView(R.id.amend_btn_save)Button mSaveBtn;@BindView(R.id.amend_btn_clean)Button mCleanBtn;@BindView(R.id.amend_insert_image_btn)View mInsertImage;@BindView(R.id.amend_pic_one)ImageView mPicOne;@BindView(R.id.amend_pic_two)ImageView mPicTwo;@BindView(R.id.amend_pic_three)ImageView mPicThree;private static final int PERMISSION_REQUEST_CODE = 2;private static final int MAX_SELECTED_COUNT = 3;private static final int PREMISSION_REQUEST_CODE = 1;private Calendar mCalendar;private int mMinute;private int mHour;private int mDay;private int mMonth;private int mSecond;private int mYear;private DatePickerDialog dialogDate;private TimePickerDialog dialogTime;private Integer year;private Integer month;private Integer dayOfMonth;private Integer hour;private Integer minute;private int mMyHourOfDay;private int mMyMinute;private int mMyDayOfMonth;private int mMyYear;private int mMyMonth;private boolean mCurrentCheckResult;private Memo mMemo;private boolean mIsNeedTips;private boolean isChanged = false;private ImagePickerConfig mPickerConfig;private String mEditDate;private static final String TAG = "AmendActivity";@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.amend_activity);ButterKnife.bind(this);checkCalendarPremission();checkImagePremission();initConfig();getDate();initView();initData();initEvent();}/*** 检查是否获取相册的读写权限* 安卓6.0以上需要动态获取权限*/
@RequiresApi(api = Build.VERSION_CODES.M)
private void checkImagePremission() {int readExStroagePermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);Log.d(TAG, "readExStroagePermission" + readExStroagePermission);if (readExStroagePermission == PackageManager.PERMISSION_GRANTED ) {//有权限} else {//没有权限requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);}
}
private void initConfig() {mPickerConfig = ImagePickerConfig.getInstance();mPickerConfig.setMaxSelectedCount(MAX_SELECTED_COUNT);mPickerConfig.setOnImageSelectedFinishLisenter((ImagePickerConfig.OnImageSelectedFinishLisenter) this);
}//返回private void initEvent() {mBackBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//输入获取内容String title = mTitle.getText().toString().trim();String body = mContent.getText().toString().trim();if (!title.equals("") && !body.equals("")) {showBackDialog(title, body);} else {startIntent();}}});//保存mSaveBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取输入内容String title = mTitle.getText().toString().trim();String body = mContent.getText().toString().trim();Log.d(TAG, "title is " + title);Log.d(TAG, "body is " + body);if (canDoSave(title, body)) {updateDb(title, body);startIntent();}}});//清空mCleanBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mContent.setText(" ");}});//监听checkBox的变化mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {isChanged = true;mCurrentCheckResult = isChecked;//如果被选中if (mCurrentCheckResult) {mDataPicker.setVisibility(View.VISIBLE);mTimePicker.setVisibility(View.VISIBLE);} else {//如果没有被选中mDataPicker.setVisibility(View.GONE);mTimePicker.setVisibility(View.GONE);}}});//选择事件日期mDataPicker.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(AmendActivity.this, "选择时间" , Toast.LENGTH_SHORT).show();//选择事件时间showDataPickerDialog();}});//选择提醒时间mTimePicker.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//选择时间showTimePickerDialog();}});//插入图片mInsertImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(AmendActivity.this, PickerActivity.class));}});}//指定日历的相关操作,增删改private void doCalendarEvent() {if (isChanged) {//如果状态改变了if (mCurrentCheckResult) {//当前选中了,insertLog.d(TAG, "do insert");} else {//当前没选中,deleteLog.d(TAG, "do delete");}} else {//如果状态没改变if (mIsNeedTips) {//需要事件提醒,updateLog.d(TAG, "do update");} else {//不需要事件提醒,nothingLog.d(TAG, "do nothing");}}}//设置提醒事件private void showTimePickerDialog() {TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {mMyHourOfDay = hourOfDay;mMyMinute = minute;mTimePicker.setText(hourOfDay + ":" + minute);}};TimePickerDialog dialog = new TimePickerDialog(this, 0, listener, mHour, mMinute, true);dialog.show();}//设置事件日期private void showDataPickerDialog() {DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {//mMyYear = year;mMyMonth = ++month;mMyDayOfMonth = dayOfMonth;mDataPicker.setText(year + "-" +mMyMonth + "-" + dayOfMonth);}};DatePickerDialog datePickerDialog = new DatePickerDialog(this, 0, listener, mYear, mMonth, mDay);datePickerDialog.show();}//能否保存private boolean canDoSave(String title, String body) {//用于判断能否保存动作//true:可以保存内容,保存内容至数据库中//false:不能保存,需要写内容boolean flag = true;if (title.equals("")) {flag = false;}if (title.length() >10) {flag = false;}if (body.length() > 200) {flag = false;}if (body.equals("")) {flag = false;}if (mCurrentCheckResult) {//如果选中“添加提醒事件”,就需要将日期时间填写完整if (mDataPicker.getText().toString().equals("") || mTimePicker.getText().toString().equals("")) {flag = false;}}return flag;}//显示dialogprivate void showBackDialog(final String title, final String body) {AlertDialog.Builder dialog = new AlertDialog.Builder(AmendActivity.this);dialog.setTitle("提示:");dialog.setMessage("是否保存当前内容");dialog.setPositiveButton("保存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//将更新保存至数据库中if (canDoSave(title, body)) {updateDb(title, body);startIntent();}}});dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//跳转至首页startIntent();}});dialog.show();}//将修改内容保存到数据库中private void updateDb(String title, String body) {ContentValues values = new ContentValues();values.put(Constants.MEMO_TITLE, title);values.put(Constants.MEMO_BODY, body);values.put(Constants.MEMO_MODIFY_TIME, mEditDate);values.put(Constants.MEMO_NEED_TIPS, mCurrentCheckResult);Log.d(TAG, "mCurrentCheckResult" + mCurrentCheckResult);DataSupport.update(Memo.class, values, mMemo.getId());Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();}//从MainActivity点击到该页面,将数据回显private void initData() {Intent intent = this.getIntent();Bundle bundle = intent.getExtras();//获取bundle中的数据if (bundle != null) {String memoTitle = intent.getStringExtra(Constants.MEMO_TITLE);String memoContent = intent.getStringExtra(Constants.MEMO_BODY);int memoId = intent.getIntExtra(Constants.MEMO_ID, 0);mIsNeedTips = intent.getBooleanExtra(Constants.MEMO_NEED_TIPS, false);//设置数据mMemo = new Memo();mMemo.setTitle(memoTitle);mMemo.setText(memoContent);mMemo.setId(memoId);mMemo.setTipsChecked(mIsNeedTips);if (mIsNeedTips) {//如果设置了提醒事件,就将日期和时间显现出来mDataPicker.setVisibility(View.VISIBLE);mTimePicker.setVisibility(View.VISIBLE);mCheckBox.setChecked(mIsNeedTips);setDateAndTime(memoTitle);}mContent.setText(memoContent);mContent.setText(memoTitle);}}//根据title获取到设置提醒的日期和时间private void setDateAndTime(String memoTitle) {ContentResolver contentResolver = getContentResolver();Uri uri = Uri.parse("content://com.android.calendar/events");Cursor cursor = contentResolver.query(uri, new String[]{CalendarContract.Events.DTSTART}, CalendarContract.Events.TITLE + "=" + memoTitle, null, null, null);String[] columnNames = cursor.getColumnNames();while (cursor.moveToNext()) {for (String columnName : columnNames) {String startTimeStr = cursor.getString(cursor.getColumnIndex(columnName));//将秒数转化为日期getTipsDate(startTimeStr);Log.d(TAG, columnName + "==" + startTimeStr);}}}//通过数据库中设置的时间获取提醒事件的时间private void getTipsDate(String startTimeStr) {long time = Long.parseLong(startTimeStr);Date date = new Date(time);GregorianCalendar gregorianCalendar = new GregorianCalendar();gregorianCalendar.setTime(date);//将日期格式进行分割:为date+timeSimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String currentTime = dateFormat.format(gregorianCalendar.getTime());Log.d(TAG, "currentTime is" +currentTime);String[] dateAndTime = currentTime.split(" ");String tipsDate = dateAndTime[0];String tipsTime = dateAndTime[1];Log.d(TAG, "tipsDate" + tipsDate);Log.d(TAG, "tipsTime" + tipsTime);mDataPicker.setText(tipsDate);mTimePicker.setText(tipsTime);}//初始化当前时间private void initView() {Date date = new Date(System.currentTimeMillis());//创建的时间,存入数据库,数据库根据时间先后显示列表mEditDate = getTimeStr(date);if (mCurrentTime.getText().length() != 0) {mCurrentTime.setText(mEditDate);}dialogDate = null;dialogTime = null;hour = 0;minute = 0;year = 0;month = 0;dayOfMonth = 0;//初始化数据库Connector.getDatabase();//获取到之前选择的图片并显示出来List<ImageItem> selectResult = mPickerConfig.getSelectResult();int seletcedSize = mPickerConfig.getSeletcedSize();if (selectResult != null) {for (ImageItem imageItem : selectResult) {Log.d(TAG, "image item is " + imageItem.getPath());}Log.d(TAG, "selected size is " + seletcedSize);}if (selectResult != null) {//显示图片switch (seletcedSize) {case 1:Glide.with(mPicOne.getContext()).load(selectResult.get(0).getPath()).into(mPicOne);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.GONE);mPicThree.setVisibility(View.GONE);break;case 2:Glide.with(mPicOne.getContext()).load(selectResult.get(0).getPath()).into(mPicOne);Glide.with(mPicTwo.getContext()).load(selectResult.get(1).getPath()).into(mPicTwo);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.VISIBLE);mPicThree.setVisibility(View.GONE);break;case 3:Glide.with(mPicOne.getContext()).load(selectResult.get(0).getPath()).into(mPicOne);Glide.with(mPicTwo.getContext()).load(selectResult.get(1).getPath()).into(mPicTwo);Glide.with(mPicThree.getContext()).load(selectResult.get(2).getPath()).into(mPicThree);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.VISIBLE);mPicThree.setVisibility(View.VISIBLE);break;}} else {mPicOne.setVisibility(View.GONE);mPicTwo.setVisibility(View.GONE);mPicThree.setVisibility(View.GONE);}}//页面跳转private void startIntent() {Intent intent = new Intent(AmendActivity.this, MainActivity.class);startActivity(intent);}//检查是否有读写日历的权限@RequiresApi(api = Build.VERSION_CODES.M)private void checkCalendarPremission() {int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);if (writePermission == PackageManager.PERMISSION_GRANTED && readPermission == PackageManager.PERMISSION_GRANTED) {//有读写权限Log.d(TAG, "has permission...");} else  {//没有读写权限Log.d(TAG, "no permission");requestPermissions(new String[] {Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR}, PERMISSION_REQUEST_CODE);}}//判断请求码结果来决定是否能成功获得权限@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length == 3 &&grantResults[0] ==PackageManager.PERMISSION_GRANTED &&grantResults[1] ==PackageManager.PERMISSION_GRANTED &&grantResults[2] ==PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "有权限", Toast.LENGTH_SHORT).show();} else {//此时没有权限finish();Toast.makeText(this, "没有权限", Toast.LENGTH_SHORT).show();}}}//获取当前时间private void getDate() {mCalendar = Calendar.getInstance();mYear = mCalendar.get(Calendar.YEAR);mCalendar.get(Calendar.MONTH);mDay = mCalendar.get(Calendar.DAY_OF_MONTH);mHour = mCalendar.get(java.util.Calendar.HOUR_OF_DAY);mMinute = mCalendar.get(java.util.Calendar.MINUTE);mSecond = mCalendar.get(Calendar.SECOND);}@Overridepublic void onSelectedFinish(List<ImageItem> selectedResult) {//所选择的图片列表在该处回来了//设置图片if (selectedResult != null) {setPics(selectedResult);}}private void setPics(List<ImageItem> selectedResult) {switch (selectedResult.size()) {case 1:Glide.with(mPicOne.getContext()).load(selectedResult.get(0).getPath()).into(mPicOne);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.GONE);mPicThree.setVisibility(View.GONE);break;case 2:Glide.with(mPicOne.getContext()).load(selectedResult.get(0).getPath()).into(mPicOne);Glide.with(mPicTwo.getContext()).load(selectedResult.get(1).getPath()).into(mPicTwo);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.VISIBLE);mPicThree.setVisibility(View.GONE);break;case 3:Glide.with(mPicOne.getContext()).load(selectedResult.get(0).getPath()).into(mPicOne);Glide.with(mPicTwo.getContext()).load(selectedResult.get(1).getPath()).into(mPicTwo);Glide.with(mPicThree.getContext()).load(selectedResult.get(2).getPath()).into(mPicThree);mPicOne.setVisibility(View.VISIBLE);mPicTwo.setVisibility(View.VISIBLE);mPicThree.setVisibility(View.VISIBLE);break;}}}

四、数据存储

备忘录数据存储采用系统内置的数据库SQLite,利用LitePal进行操作

五、实体类——Memo

package test_5;import org.litepal.crud.DataSupport;public class Memo extends DataSupport {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 getText() {return text;}public void setText(String text) {this.text = text;}public Integer getImageId() {return imageId;}public void setImageId(Integer imageId) {this.imageId = imageId;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}public boolean isTipsChecked() {return isTipsChecked;}public void setTipsChecked(boolean tipsChecked) {isTipsChecked = tipsChecked;}private Integer id;private String title;private String text;private String createTime;private boolean isTipsChecked;private Integer imageId;}

项目地址


总结

Android小项目——简易备忘录相关推荐

  1. Android 小项目之--数据存储【Files】(附源码)

    继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...

  2. linux 蓝牙 手机遥控器,嵌入式Android小项目之万能手机遥控器详解

    原标题:嵌入式Android小项目之万能手机遥控器详解 在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了. 红外本身还是有些优点,比如操作简便,成本低.要想 ...

  3. Android小项目———— 冰炭不投de小计算器

    我的第一个Android小项目 冰炭不投de小计算器 一.前言 这是我首个使用java写的app,也在学习郭霖老师的第一行代码和李刚老师的疯狂java讲义之时,进行的练习之作,刚刚学习java和and ...

  4. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  5. 一个特别适合新手练习的Android小项目——每日一妹纸

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 当前版本V 1.2 刚开始学习Android的时候,主要就是学习了一些Activity的生命周期,各种View和Layout的 ...

  6. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

  7. Android 小项目之--Mini音乐播放器【简单版】(附源码)

    上篇文章讲服务的例子中,有个演示服务的后台播放音乐,今天就来讲一讲多媒体之一的音乐播放. 说到多媒体不得不向上追溯,空间多媒体是如何实现的,如何可以让我们轻松的播放音乐.视频?本章讲述点大致如下: 1 ...

  8. Android小项目——新闻APP

    前言: 在公司学习了一段时间Android知识,决定做一个小项目,目的是学会运用所学的基础知识,在这里记录一下开发历程,大家可以把它看成一款入门级练手的 Demo 应用吧~ 项目概述: 类型: 新闻A ...

  9. android小项目之新闻客户端四

     基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的 ...

最新文章

  1. postfix邮件系统经典退信
  2. Java Web开发小结
  3. 7.5 GRASP原则五:高内聚 High Cohesion
  4. hdu-1176(dp)
  5. 关于Spring AOP,除了动态代理、CGLIB,你还知道什么?
  6. ASP.NET生成静态页面方法大全(3)
  7. linux性能诊断,linux下跟性能相关的命令以及系统性能诊断
  8. Caffe、TensorFlow、MXnet三个开源库对比+主流分类模型对比
  9. Oracle11g导出空表解决方法
  10. DOOM启世录的启示
  11. P18-Vue3后台管理系统-用户管理界面-表格编辑和删除操作
  12. 林业局计算机考试试题,汕头市农业局林业局计算机信息网络安全保护管理制度...
  13. 萤石云摄像头方向操控前端代码
  14. AcWing 143. 最大异或对 —— 神奇的二进制
  15. 黑鲨重装计算机安装无法继续,黑鲨教你重装系统解决电脑开机无法进入系统问题...
  16. hdu5769Substring
  17. 表格内容相同单元格合并
  18. 【教程】如何导入批量加海外号码到手机通讯录加whatsApp和line
  19. 学院官网项目三级页面总结
  20. 计算机软件基础第四章答案,计算机应用基础第四章

热门文章

  1. netstat -anp |awk |cut 通过pid获取应用程序的端口号
  2. 深入理解Linux进程概念
  3. sim7000c驱动_SIMCOM 芯讯通NB-IoT模组 SIM7000C-N【最新版】_物联网-云市场-阿里云
  4. 智慧金融解决方案-最新全套合集
  5. 【REACT NATIVE 系列教程之六】重写SHOULDCOMPONENTUPDATE指定组件是否进行重绘
  6. java io教学文件_通过代码实例跟我学Java语言程序设计及应用技术——Java文件IO技术及应用相关的教学示例(第3部分)...
  7. 系统/应用优化经验总结及资料整理
  8. PPT模板 | 蓝金风格年会PPT模板
  9. word中画网格立方体_如何在Microsoft Word中制作点网格纸模板
  10. H5页面,js监听安卓手机返回按键操作,禁用返回按键操作。