Android小專案——簡易備忘錄的實作
簡易備忘錄主要實作功能類似手機默認備忘錄,可以對備忘錄目錄進行增添和洗掉,在編輯頁面,可以顯示當前時間,編輯備忘錄標題,備忘錄內容,設定時間提醒,插入圖片等
文章目錄
- Android小專案——簡易備忘錄的實作
- 前言
- 一、主界面UI及功能
- 主要功能介紹
- 主界面的xml代碼
- 主界面的java代碼
- 二、新建備忘錄頁面
- 主要功能介紹
- xml代碼
- java代碼
- 三、編輯已保存備忘錄頁面
- 主要功能介紹
- xml代碼
- JAVA代碼
- 四、資料存盤
- 五、物體類——Memo
- 總結
前言
簡易備忘錄主要實作功能類似手機默認備忘錄,可以對備忘錄目錄進行增添和洗掉,在編輯頁面,可以顯示當前時間,編輯備忘錄標題,備忘錄內容,設定時間提醒,插入圖片等
一、主界面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;
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)
@Override
protected 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);
}
}
//判斷請求碼結果來決定是否能成功獲取權限
@Override
public 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() {
@Override
public void onClick(View v) {
//獲取輸入內容
String title = mMomeTitle.getText().toString().trim();
String body = mContextEv.getText().toString().trim();
if (!title.equals("") && !body.equals("")) {
//如果標題,內容都不為空,則顯示dialog
showDialog(title, body);
} else {
//如果都為空則回傳
startIntent();
}
}
});
//保存
mSaveBtn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public 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() {
@Override
public void onClick(View v) {
mContextEv.setText(" ");
}
});
//是否設定提醒事件,checkbox是否被選中
mIsTip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public 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() {
@Override
public void onClick(View v) {
Toast.makeText(EditActivity.this, "1111", Toast.LENGTH_SHORT).show();
//選擇事件時間
showDatePickerDialog();
//設定time為可見
mTipsTime.setVisibility(View.VISIBLE);
}
});
//選擇提醒時間
mTipsTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//選擇時間
showTimePickerDialog();
}
});
//插入圖片被點擊了,跳轉到picker界面
mInsertImageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(EditActivity.this, PickerActivity.class));
}
});
}
//設定提醒時間
private void showTimePickerDialog() {
TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {
@Override
public 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() {
@Override
public 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);
//日歷ID
values.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);
//插入提醒
//獲取當前插入事件的ID
String 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;
}
//顯示dialog
private 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)
@Override
public 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() {
@Override
public 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();
}
@Override
public 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"?>
<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/amend_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/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"/>
<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/amend_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/amend_content"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_marginTop="10dp"
android:gravity="start"
android:hint="在此輸入內容"/>
<LinearLayout
android: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">
<LinearLayout
android:id="@+id/amend_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/amend_pic_one"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="20dp"
android:src="@drawable/ic_launcher_foreground"
android:visibility="gone" />
<ImageView
android: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" />
<ImageView
android: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>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/amend_memo_is_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="是否設定提醒"/>
<TextView
android:id="@+id/amend_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/amend_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/amend_btn_save"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="50dp"
android:background="#FFFFF0"
android:text="保存"/>
<Button
android: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)
@Override
protected 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public void onClick(View v) {
mContent.setText(" ");
}
});
//監聽checkBox的變化
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public 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() {
@Override
public void onClick(View v) {
Toast.makeText(AmendActivity.this, "選擇時間" , Toast.LENGTH_SHORT).show();
//選擇事件時間
showDataPickerDialog();
}
});
//選擇提醒時間
mTimePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//選擇時間
showTimePickerDialog();
}
});
//插入圖片
mInsertImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(AmendActivity.this, PickerActivity.class));
}
});
}
//指定日歷的相關操作,增刪改
private void doCalendarEvent() {
if (isChanged) {
//如果狀態改變了
if (mCurrentCheckResult) {
//當前選中了,insert
Log.d(TAG, "do insert");
} else {
//當前沒選中,delete
Log.d(TAG, "do delete");
}
} else {
//如果狀態沒改變
if (mIsNeedTips) {
//需要事件提醒,update
Log.d(TAG, "do update");
} else {
//不需要事件提醒,nothing
Log.d(TAG, "do nothing");
}
}
}
//設定提醒事件
private void showTimePickerDialog() {
TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {
@Override
public 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() {
@Override
public 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;
}
//顯示dialog
private 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() {
@Override
public void onClick(DialogInterface dialog, int which) {
//將更新保存至資料庫中
if (canDoSave(title, body)) {
updateDb(title, body);
startIntent();
}
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public 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+time
SimpleDateFormat 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);
}
}
//判斷請求碼結果來決定是否能成功獲得權限
@Override
public 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);
}
@Override
public 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;
}
總結
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/244310.html
標籤:其他
上一篇:ListView
