Android小项目——简易备忘录

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
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值