From 5749a40d4b1a419039c080bdcd9f20383f5f0867 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=85=A7=E9=9C=96?= <1806370119@qq.com>
Date: Fri, 19 Jan 2024 09:06:34 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../.idea/deploymentTargetDropDown.xml | 17 -----
.../micode/notes/ui/AlarmInitReceiver.java | 4 --
.../net/micode/notes/ui/DateTimePicker.java | 5 +-
.../micode/notes/ui/DateTimePickerDialog.java | 1 -
.../micode/notes/ui/FoldersListAdapter.java | 12 ++--
.../net/micode/notes/ui/NoteEditActivity.java | 8 +--
.../net/micode/notes/ui/NoteEditText.java | 71 ++++++++++++++++++-
7 files changed, 82 insertions(+), 36 deletions(-)
delete mode 100644 src/Notes-master1/.idea/deploymentTargetDropDown.xml
diff --git a/src/Notes-master1/.idea/deploymentTargetDropDown.xml b/src/Notes-master1/.idea/deploymentTargetDropDown.xml
deleted file mode 100644
index 1fe7e43..0000000
--- a/src/Notes-master1/.idea/deploymentTargetDropDown.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java
index 03ff591..f06f948 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java
@@ -58,17 +58,13 @@ public class AlarmInitReceiver extends BroadcastReceiver {
do {
long alertDate = c.getLong(COLUMN_ALERTED_DATE);
// 获取提醒时间和笔记ID
-
Intent sender = new Intent(context, AlarmReceiver.class);
sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID)));
// 创建用于触发闹钟的Intent
-
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0);
// 创建PendingIntent,用于启动AlarmReceiver
-
AlarmManager alermManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// 获取AlarmManager
-
alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);
// 设置闹钟,在提醒时间触发
} while (c.moveToNext());
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
index 6ba6189..bfdfb22 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
@@ -28,9 +28,10 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
+//DateTimePicker是一个自定义的日期和时间选择器的类,它的外观和行为基于 FrameLayout 进行扩展。
+//FrameLayout是布局模板之一
+//所有的子元素全部在屏幕的右上方
public class DateTimePicker extends FrameLayout {
- //FrameLayout是布局模板之一
- //所有的子元素全部在屏幕的右上方
private static final boolean DEFAULT_ENABLE_STATE = true;
private static final int HOURS_IN_HALF_DAY = 12;
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java
index 58ab008..0f6a9f0 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java
@@ -99,5 +99,4 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener
}
}//第一个参数arg0是接收到点击事件的对话框
//第二个参数arg1是该对话框上的按钮
-
}
\ No newline at end of file
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java
index 2c35db4..fc28837 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java
@@ -27,13 +27,13 @@ import android.widget.TextView;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
-
-
+
+
+//CursorAdapter是Cursor和ListView的接口
+//FoldersListAdapter继承了CursorAdapter的类
+//主要作用是便签数据库和用户的交互
+//这里就是用folder(文件夹)的形式展现给用户
public class FoldersListAdapter extends CursorAdapter {
- //CursorAdapter是Cursor和ListView的接口
- //FoldersListAdapter继承了CursorAdapter的类
- //主要作用是便签数据库和用户的交互
- //这里就是用folder(文件夹)的形式展现给用户
public static final String [] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
index d46465a..b1a6c77 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -72,12 +72,12 @@ import java.util.HashSet;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-
-
+
+
+//该类主要是针对标签的编辑
+//继承了系统内部许多和监听有关的类
public class NoteEditActivity extends Activity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener {
- //该类主要是针对标签的编辑
- //继承了系统内部许多和监听有关的类
private class HeadViewHolder {
public TextView tvModified;
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java
index 2afe2a8..d246d3b 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java
@@ -46,6 +46,7 @@ public class NoteEditText extends EditText {
private static final String SCHEME_HTTP = "http:" ;
private static final String SCHEME_EMAIL = "mailto:" ;
+ ///建立一个字符和整数的hash表,用于链接电话,网站,还有邮箱
private static final Map sSchemaActionResMap = new HashMap();
static {
sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel);
@@ -56,17 +57,20 @@ public class NoteEditText extends EditText {
/**
* Call by the {@link NoteEditActivity} to delete or add edit text
*/
+ //在NoteEditActivity中删除或添加文本的操作,可以看做是一个文本是否被变的标记,英文注释已说明的很清楚
public interface OnTextViewChangeListener {
/**
* Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens
* and the text is null
*/
+ //处理删除按键时的操作
void onEditTextDelete(int index, String text);
/**
* Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER}
* happen
*/
+ //处理进入按键时的操作
void onEditTextEnter(int index, String text);
/**
@@ -77,43 +81,55 @@ public class NoteEditText extends EditText {
private OnTextViewChangeListener mOnTextViewChangeListener;
+ //根据context设置文本
public NoteEditText(Context context) {
super(context, null);
mIndex = 0;
}
+ //设置当前光标
public void setIndex(int index) {
mIndex = index;
}
+ //初始化文本修改标记
public void setOnTextViewChangeListener(OnTextViewChangeListener listener) {
mOnTextViewChangeListener = listener;
}
+ //AttributeSet 百度了一下是自定义空控件属性,用于维护便签动态变化的属性
+ //初始化便签
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
}
+ // 根据defstyle自动初始化
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
+//view里的函数,处理手机屏幕的所有事件
+ /*参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,
+ 例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
+ //重写了需要处理屏幕被按下的事件
case MotionEvent.ACTION_DOWN:
+ //跟新当前坐标值
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
y -= getTotalPaddingTop();
x += getScrollX();
y += getScrollY();
-
+ //用布局控件layout根据x,y的新值设置新的位置
Layout layout = getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
+ //更新光标新的位置
Selection.setSelection(getText(), off);
break;
}
@@ -122,96 +138,147 @@ public class NoteEditText extends EditText {
}
@Override
+ /*
+ * 函数功能:处理用户按下一个键盘按键时会触发 的事件
+ * 实现过程:如下注释
+ */
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
+ //根据按键的 Unicode 编码值来处理
case KeyEvent.KEYCODE_ENTER:
+ //“进入”按键
if (mOnTextViewChangeListener != null) {
return false;
}
break;
case KeyEvent.KEYCODE_DEL:
+ //“删除”按键
mSelectionStartBeforeDelete = getSelectionStart();
break;
default:
break;
}
+ //继续执行父类的其他点击事件
return super.onKeyDown(keyCode, event);
}
@Override
+ /*
+ * 函数功能:处理用户松开一个键盘按键时会触发 的事件
+ * 实现方式:如下注释
+ */
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch(keyCode) {
+ //根据按键的 Unicode 编码值来处理,有删除和进入2种操作
case KeyEvent.KEYCODE_DEL:
if (mOnTextViewChangeListener != null) {
+ //若是被修改过
if (0 == mSelectionStartBeforeDelete && mIndex != 0) {
+ //若之前有被修改并且文档不为空
mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString());
+ //利用上文OnTextViewChangeListener对KEYCODE_DEL按键情况的删除函数进行删除
return true;
}
} else {
Log.d(TAG, "OnTextViewChangeListener was not seted");
+ //其他情况报错,文档的改动监听器并没有建立
}
break;
case KeyEvent.KEYCODE_ENTER:
+ //同上也是分为监听器是否建立2种情况
if (mOnTextViewChangeListener != null) {
int selectionStart = getSelectionStart();
+ //获取当前位置
String text = getText().subSequence(selectionStart, length()).toString();
+ //获取当前文本
setText(getText().subSequence(0, selectionStart));
+ //根据获取的文本设置当前文本
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
+ //当{@link KeyEvent#KEYCODE_ENTER}添加新文本
} else {
Log.d(TAG, "OnTextViewChangeListener was not seted");
+ //其他情况报错,文档的改动监听器并没有建立
}
break;
default:
break;
}
+ //继续执行父类的其他按键弹起的事件
return super.onKeyUp(keyCode, event);
}
@Override
+ /*
+ * 函数功能:当焦点发生变化时,会自动调用该方法来处理焦点改变的事件
+ * 实现方式:如下注释
+ * 参数:focused表示触发该事件的View是否获得了焦点,当该控件获得焦点时,Focused等于true,否则等于false。
+ direction表示焦点移动的方向,用数值表示
+ Rect:表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域,即表示焦点是从哪里来的。如果不可用则为null
+ */
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if (mOnTextViewChangeListener != null) {
+ //若监听器已经建立
if (!focused && TextUtils.isEmpty(getText())) {
+ //获取到焦点并且文本不为空
mOnTextViewChangeListener.onTextChange(mIndex, false);
+ //mOnTextViewChangeListener子函数,置false隐藏事件选项
} else {
mOnTextViewChangeListener.onTextChange(mIndex, true);
+ //mOnTextViewChangeListener子函数,置true显示事件选项
}
}
+ //继续执行父类的其他焦点变化的事件
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
+ /*
+ * 函数功能:生成上下文菜单
+ * 函数实现:如下注释
+ */
protected void onCreateContextMenu(ContextMenu menu) {
if (getText() instanceof Spanned) {
+ //有文本存在
int selStart = getSelectionStart();
int selEnd = getSelectionEnd();
+ //获取文本开始和结尾位置
int min = Math.min(selStart, selEnd);
int max = Math.max(selStart, selEnd);
+ //获取开始到结尾的最大值和最小值
final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);
+ //设置url的信息的范围值
if (urls.length == 1) {
int defaultResId = 0;
for(String schema: sSchemaActionResMap.keySet()) {
+ //获取计划表中所有的key值
if(urls[0].getURL().indexOf(schema) >= 0) {
+ //若url可以添加则在添加后将defaultResId置为key所映射的值
defaultResId = sSchemaActionResMap.get(schema);
break;
}
}
if (defaultResId == 0) {
+ //defaultResId == 0则说明url并没有添加任何东西,所以置为连接其他SchemaActionResMap的值
defaultResId = R.string.note_link_other;
}
+ //建立菜单
menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
+ //新建按键监听器
public boolean onMenuItemClick(MenuItem item) {
// goto a new intent
urls[0].onClick(NoteEditText.this);
+ //根据相应的文本设置菜单的按键
return true;
}
});
}
}
+ //继续执行父类的其他菜单创建的事件
super.onCreateContextMenu(menu);
}
-}
+}
\ No newline at end of file
From 103597e5adceed74350f75b7a32b9ca47311edf5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=85=A7=E9=9C=96?= <1806370119@qq.com>
Date: Fri, 19 Jan 2024 09:08:53 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/src/main/java/net/micode/notes/ui/DateTimePicker.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
index bfdfb22..6233687 100644
--- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
+++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java
@@ -27,7 +27,7 @@ import android.text.format.DateFormat;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
-
+
//DateTimePicker是一个自定义的日期和时间选择器的类,它的外观和行为基于 FrameLayout 进行扩展。
//FrameLayout是布局模板之一
//所有的子元素全部在屏幕的右上方
@@ -35,7 +35,7 @@ public class DateTimePicker extends FrameLayout {
private static final boolean DEFAULT_ENABLE_STATE = true;
private static final int HOURS_IN_HALF_DAY = 12;
- private static final int HOURS_IN_ALL_DAY = 24;
+ private static final int HOURS_IN_ALL_DAY = 24;S
private static final int DAYS_IN_ALL_WEEK = 7;
private static final int DATE_SPINNER_MIN_VAL = 0;
private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1;