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