From a8b82435020f8e344cbc303a16cc366738782b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Wed, 27 Dec 2023 00:18:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E6=B3=A8=E4=BA=86NoteEditActivity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/report.docx | Bin 428098 -> 428606 bytes .../net/micode/notes/ui/NoteEditActivity.java | 444 ++++++++++++------ .../net/micode/notes/ui/NoteEditText.java | 9 +- 3 files changed, 313 insertions(+), 140 deletions(-) diff --git a/doc/report.docx b/doc/report.docx index dedc5fa830e49094c0cd4e868107aee2000fba3d..63f6a491379cee640723c3bdc86b367d90860fbc 100644 GIT binary patch delta 18472 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 delta 17877 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 sBgSelectorBtnsMap = new HashMap(); static { sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); @@ -101,7 +108,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); } - + //字体大小的视图 private static final Map sFontSizeBtnsMap = new HashMap(); static { sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); @@ -118,37 +125,48 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); } - private static final String TAG = "NoteEditActivity"; + private static final String TAG = "NoteEditActivity"; // 用于日志打印的标签,分类接收消息 + + private HeadViewHolder mNoteHeaderHolder; // 列表头视图容器持有者 + + private View mHeadViewPanel; // 头部视图面板 - private HeadViewHolder mNoteHeaderHolder; + private View mNoteBgColorSelector; // 笔记背景颜色选择器视图 - private View mHeadViewPanel; + private View mFontSizeSelector; // 字体大小选择器视图 - private View mNoteBgColorSelector; + private EditText mNoteEditor; // 笔记编辑器输入框 - private View mFontSizeSelector; + private View mNoteEditorPanel; // 笔记编辑器面板 - private EditText mNoteEditor; + private WorkingNote mWorkingNote; // 当前正在编辑的工作笔记对象 - private View mNoteEditorPanel; + private SharedPreferences mSharedPrefs; // 用于存储和检索应用偏好设置的对象 - private WorkingNote mWorkingNote; + private int mFontSizeId; // 当前选中的字体大小的资源ID - private SharedPreferences mSharedPrefs; - private int mFontSizeId; + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; // 偏好设置中用于保存字体大小的键 - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; // 快捷方式图标标题的最大长度 - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; + public static final String TAG_CHECKED = String.valueOf('\u221A'); // 特殊符号,对钩(可能用于任务视图中表示任务已完成) - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); // 特殊符号,空心方块(可能用于任务视图中表示任务未完成) - private LinearLayout mEditTextList; + private LinearLayout mEditTextList; // 线性布局,可能用于动态添加或显示多个EditText - private String mUserQuery; - private Pattern mPattern; + private String mUserQuery; // 用户输入的查询字符串 + private Pattern mPattern; // 用于匹配用户查询的正则表达式模式对象 + + /** + * @classname: NoteEditActivity + * @methodname onCreate + * @description:在活动创建之前进行初始化工作:包括视图的准备,资源的加载 + * @date: 2023/12/25 8:34 + * @author: Xia Yanbo + * @param:保存的设置的状态 + */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -164,58 +182,71 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** * Current activity may be killed when the memory is low. Once it is killed, for another time * user load this activity, we should restore the former state + * 当重新使用某个活动时,把它恢复到之前离开的状态 */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { + super.onRestoreInstanceState(savedInstanceState);//调用父类 + if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {//检查保存的状态是否为空,是否包含特定意图 Intent intent = new Intent(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); - if (!initActivityState(intent)) { - finish(); - return; + intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));//之前保存的意图附加其上 + if (!initActivityState(intent)) { // 调用 initActivityState 方法来处理这个 Intent,可能进行一些初始化工作或状态设置。 + finish(); // 如果 initActivityState 方法返回 false,表示初始化失败,此时结束当前活动。 + return; // 结束当前方法。 } Log.d(TAG, "Restoring from killed activity"); } } - + /** + * @classname: NoteEditActivity + * @methodname initActivityState + * @description: + * @date: 2023/12/25 8:44 + * @author: Xia Yanbo + * @param:intent意图消息 + * @return: + */ private boolean initActivityState(Intent intent) { /** * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, * then jump to the NotesListActivity */ mWorkingNote = null; - if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { + if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {//检查意图是否是查看 long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); mUserQuery = ""; /** * Starting from the searched result + * 如果intent包含额外的数据键 */ if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { + //解析数据键,获取笔记ID以及查询字符串 noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); } - + //如果笔记id在数据库中不可见 if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { Intent jump = new Intent(this, NotesListActivity.class); - startActivity(jump); + startActivity(jump);//跳转到笔记集活动中 showToast(R.string.error_note_not_exist); finish(); return false; } else { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { + mWorkingNote = WorkingNote.load(this, noteId);//加载笔记对象 + if (mWorkingNote == null) {//如果笔记对象为空,记录错误日志并且结束当前活动 Log.e(TAG, "load note failed with note id" + noteId); finish(); return false; } } + // 设置软键盘状态为隐藏,调整窗口大小以适应内容 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { + } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {//否则,意图并非查看的情况 // New note + //获取额外的数据各类ID以及类型等数据 long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); @@ -227,7 +258,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, // Parse call-record note String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); - if (callDate != 0 && phoneNumber != null) { + if (callDate != 0 && phoneNumber != null) {//负责消息通知 if (TextUtils.isEmpty(phoneNumber)) { Log.w(TAG, "The call record number is null"); } @@ -247,7 +278,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } else { mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, - bgResId); + bgResId);//电话号码和提醒日期都为空,直接创建新表 } getWindow().setSoftInputMode( @@ -263,26 +294,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, } @Override + //初始化屏幕 protected void onResume() { super.onResume(); initNoteScreen(); } - + // 定义一个私有方法initNoteScreen,用于初始化Note屏幕 private void initNoteScreen() { + // 设置Note编辑器的文本外观,使用指定的字体大小ID(标记,分别更改字体大小的功能可以类似实现) mNoteEditor.setTextAppearance(this, TextAppearanceResources .getTexAppearanceResource(mFontSizeId)); + // 检查当前Note是否处于Check List模式 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + // 如果处于Check List模式,调用switchToListMode方法并传入Note的内容 switchToListMode(mWorkingNote.getContent()); } else { + // 如果不是Check List模式,设置Note编辑器的文本为高亮查询结果,并选择文本的末尾 mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); mNoteEditor.setSelection(mNoteEditor.getText().length()); } + // 遍历sBgSelectorSelectionMap的键集合,并隐藏对应的视图。 for (Integer id : sBgSelectorSelectionMap.keySet()) { findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); } + //给资源设置id mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - + //设置修改日期的显示文本 mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME @@ -294,11 +332,17 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ showAlertHeader(); } - + /** + * @classname: NoteEditActivity + * @methodname showAlertHeader + * @description:对于便签里设定的提醒时间,设置显示并在到达时间时发出提醒 + * @date: 2023/12/25 14:45 + * @author: Xia Yanbo + */ private void showAlertHeader() { if (mWorkingNote.hasClockAlert()) { long time = System.currentTimeMillis(); - if (time > mWorkingNote.getAlertDate()) { + if (time > mWorkingNote.getAlertDate()) {//判断时间是否到达 mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); } else { mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( @@ -311,12 +355,19 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); }; } - + //根据新的意图重新初始化活动状态 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); initActivityState(intent); } + /** + * @classname: NoteEditActivity + * @methodname onSaveInstanceState + * @description: 未保存到数据库的便签分配ID并保存 + * @date: 2023/12/25 14:59 + * @author: Xia Yanbo + */ @Override protected void onSaveInstanceState(Bundle outState) { @@ -332,7 +383,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); } - + /** + * @classname: NoteEditActivity + * @methodname dispatchTouchEvent + * @description:当触摸事件不在范围内时,选择性隐藏显示的字体和主题颜色窗口选项 + * @date: 2023/12/25 15:10 + * @author: Xia Yanbo + * @param:ev 触摸事件 + * @return:boolean 是否进行隐藏 + */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE @@ -348,21 +407,36 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return super.dispatchTouchEvent(ev); } - + /** + * @classname: NoteEditActivity + * @methodname inRangeOfView + * @description:检查触摸时间是否在视图的范围之内 + * @date: 2023/12/25 15:05 + * @author: Xia Yanbo + * @param:view 窗口视图 + * @param:ev 触摸事件 + * @return:boolean在范围内返回true,否则返回false + */ private boolean inRangeOfView(View view, MotionEvent ev) { int []location = new int[2]; - view.getLocationOnScreen(location); + view.getLocationOnScreen(location);//获取视图在屏幕上的位置 int x = location[0]; int y = location[1]; - if (ev.getX() < x + if (ev.getX() < x//判断事件有没有在视图所在的范围之内 || ev.getX() > (x + view.getWidth()) || ev.getY() < y || ev.getY() > (y + view.getHeight())) { - return false; - } + return false; + } return true; } - + /** + * @classname: NoteEditActivity + * @methodname initResources + * @description:初始化资源项,进行便签显示组件的准备与id初始化 + * @date: 2023/12/25 15:13 + * @author: Xia Yanbo + */ private void initResources() { mHeadViewPanel = findViewById(R.id.note_title); mNoteHeaderHolder = new HeadViewHolder(); @@ -390,13 +464,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, * HACKME: Fix bug of store the resource id in shared preference. * The id may larger than the length of resources, in this case, * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + * 资源id大小可能会越界,这时返回缺省的BG_DEFAULT_FONT_SIZE */ if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; } mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); } - + //一系列输入暂停时,进行便签内容的保存,并输出保存的长度信息 @Override protected void onPause() { super.onPause(); @@ -405,53 +480,66 @@ public class NoteEditActivity extends Activity implements OnClickListener, } clearSettingState(); } - + /** + * @classname: NoteEditActivity + * @methodname updateWidget + * @description:更新控件 + * @date: 2023/12/25 15:17 + * @author: Xia Yanbo + */ private void updateWidget() { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { + if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {//检查当前工作笔记的控件类型,给对应的提供类 intent.setClass(this, NoteWidgetProvider_2x.class); } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { intent.setClass(this, NoteWidgetProvider_4x.class); - } else { + } else {//控件类型不受支持,打印错误日志 Log.e(TAG, "Unspported widget type"); return; } intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - mWorkingNote.getWidgetId() + mWorkingNote.getWidgetId()//给意图intent添加要更新的控件的id }); - sendBroadcast(intent); - setResult(RESULT_OK, intent); + sendBroadcast(intent);//通知系统更新小控件 + setResult(RESULT_OK, intent);//通知调用者已完成 } - + /** + * @classname: NoteEditActivity + * @methodname onClick + * @description:通过点击的位置获取工作视图,并进行设置背景色,选择背景色,选择字体大小三种点击事件的处理 + * @date: 2023/12/25 15:30 + * @author: Xia Yanbo + * @param: v视图 + */ public void onClick(View v) { int id = v.getId(); - if (id == R.id.btn_set_bg_color) { + if (id == R.id.btn_set_bg_color) {// 如果点击的是设置背景色的按钮 mNoteBgColorSelector.setVisibility(View.VISIBLE); findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - - View.VISIBLE); - } else if (sBgSelectorBtnsMap.containsKey(id)) { + View.VISIBLE);//之前这里报错,已修改,显示背景色选择器 + } else if (sBgSelectorBtnsMap.containsKey(id)) { // 如果点击的是背景色选择器的某个按钮 findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.GONE); - mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); + mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));// 设置工作笔记的背景色ID为选择的背景色ID mNoteBgColorSelector.setVisibility(View.GONE); - } else if (sFontSizeBtnsMap.containsKey(id)) { - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); - mFontSizeId = sFontSizeBtnsMap.get(id); - mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + } else if (sFontSizeBtnsMap.containsKey(id)) {// 如果点击的是字体大小选择器的某个按钮 + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);// 隐藏当前字体大小选择器 + mFontSizeId = sFontSizeBtnsMap.get(id); // 设置字体大小ID为选择的字体大小ID + mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); // 将字体大小ID保存到SharedPreferences中 + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);// 显示新的字体大小选择器 + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { // 如果笔记处于检查列表模式,则获取文本并切换到列表模式(两种模式是分开的) getWorkingText(); switchToListMode(mWorkingNote.getContent()); - } else { + } else { // 否则,设置文本的外观为新的字体大小 mNoteEditor.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); } mFontSizeSelector.setVisibility(View.GONE); } } - + //用户按下返回键时,清楚可见的设置状态并保存便签 @Override public void onBackPressed() { if(clearSettingState()) { @@ -461,7 +549,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, saveNote(); super.onBackPressed(); } - + //将还未被隐藏的选择器组件隐藏起来 private boolean clearSettingState() { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { mNoteBgColorSelector.setVisibility(View.GONE); @@ -472,31 +560,45 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return false; } - + //当背景颜色发生更改时,更新相应的ui资源id public void onBackgroundColorChanged() { findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.VISIBLE); mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); } - + /** + * @classname: NoteEditActivity + * @methodname onPrepareOptionsMenu + * @description:准备菜单项 + * @date: 2023/12/25 15:54 + * @author: Xia Yanbo + * @param:menu 当前Activity的菜单对象。 + * @return:如果已成功准备菜单,则返回true;否则返回false + */ @Override public boolean onPrepareOptionsMenu(Menu menu) { + // 如果Activity即将被销毁,则直接返回true,不再继续准备菜单 if (isFinishing()) { return true; } + //将还未隐藏的选择器组件隐藏 clearSettingState(); + //清除已有的菜单的所有项 menu.clear(); + // 根据笔记所在的文件夹ID来决定使用哪个菜单布局 if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { getMenuInflater().inflate(R.menu.call_note_edit, menu); } else { getMenuInflater().inflate(R.menu.note_edit, menu); } + // 根据笔记的文本模式来设置菜单项的标题 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); } else { menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); } + // 根据笔记是否设置了闹钟提醒来决定是否显示某些菜单项 if (mWorkingNote.hasClockAlert()) { menu.findItem(R.id.menu_alert).setVisible(false); } else { @@ -504,23 +606,32 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return true; } - + /** + * @classname: NoteEditActivity + * @methodname onOptionsItemSelected + * @description:根据所选择的菜单项执行相应的功能 + * @date: 2023/12/25 16:22 + * @author: Xia Yanbo + * @param:item 当前便签内的菜单 + * @return:boolean 已经选中事件被成功处理返回true,否则返回false + */ @Override public boolean onOptionsItemSelected(MenuItem item) { - + //新建笔记 if ( item.getItemId()==R.id.menu_new_note) { createNewNote(); } + //删除笔记 else if(item.getItemId()== R.id.menu_delete) { - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_note)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { + //弹出确认删除的警示框 + AlertDialog.Builder builder = new AlertDialog.Builder(this); // 创建一个AlertDialog的构建器 + builder.setTitle(getString(R.string.alert_title_delete)); // 设置标题为“删除” + builder.setIcon(android.R.drawable.ic_dialog_alert); // 设置图标为警告图标 + builder.setMessage(getString(R.string.alert_message_delete_note)); // 设置消息为删除笔记的提示信息 + builder.setPositiveButton(android.R.string.ok, // 设置确认按钮 + new DialogInterface.OnClickListener() {//点击事件监听器 public void onClick(DialogInterface dialog, int which) { deleteCurrentNote(); finish(); @@ -529,41 +640,47 @@ public class NoteEditActivity extends Activity implements OnClickListener, builder.setNegativeButton(android.R.string.cancel, null); builder.show(); } + //字体大小功能项 else if(item.getItemId()== R.id.menu_font_size) { - mFontSizeSelector.setVisibility(View.VISIBLE); + mFontSizeSelector.setVisibility(View.VISIBLE);//显示字体大小选择器 findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); } + //列表模式 else if(item.getItemId()== R.id.menu_list_mode) { mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0); } + //分享 else if(item.getItemId()== R.id.menu_share) { - getWorkingText(); - sendTo(this, mWorkingNote.getContent()); + getWorkingText();//获取当前笔记的文本内容 + sendTo(this, mWorkingNote.getContent());//分享出去 } + //发送到桌面 else if(item.getItemId()== R.id.menu_send_to_desktop) { sendToDesktop(); } + //设置提醒 else if(item.getItemId()== R.id.menu_alert) { setReminder(); } + //删除提醒 else if(item.getItemId()== R.id.menu_delete_remind) { mWorkingNote.setAlertDate(0, false); } return true; } - + //设置时间提醒 private void setReminder() { DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); - d.setOnDateTimeSetListener(new OnDateTimeSetListener() { + d.setOnDateTimeSetListener(new OnDateTimeSetListener() {//监听设置的时间 public void OnDateTimeSet(AlertDialog dialog, long date) { - mWorkingNote.setAlertDate(date , true); + mWorkingNote.setAlertDate(date , true);//设置提醒的日期时间 } }); d.show(); @@ -572,69 +689,87 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** * Share note to apps that support {@link Intent#ACTION_SEND} action * and {@text/plain} type + * 将便签发送到支持的app应用 */ private void sendTo(Context context, String info) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, info); - intent.setType("text/plain"); - context.startActivity(intent); + Intent intent = new Intent(Intent.ACTION_SEND);//意图为发送 + intent.putExtra(Intent.EXTRA_TEXT, info);//附加要发送的信息到intent + intent.setType("text/plain");//设定传输的类型 + context.startActivity(intent);//根据意图开始发送信息 } - + //创建一个新的便签 private void createNewNote() { // Firstly, save current editing notes - saveNote(); + saveNote();//保存当前便签 // For safety, start a new NoteEditActivity - finish(); + finish();//销毁资源,关闭当前便签 Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT);//设置活动为编辑 + intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());//附加包和便签的id startActivity(intent); } - + /** + * @classname: NoteEditActivity + * @methodname deleteCurrentNote + * @description:删除当前便签 + * @date: 2023/12/25 21:28 + * @author: Xia Yanbo + */ private void deleteCurrentNote() { - if (mWorkingNote.existInDatabase()) { - HashSet ids = new HashSet(); + if (mWorkingNote.existInDatabase()) {//检查笔记是否在数据库里 + HashSet ids = new HashSet();// 创建一个空的HashSet用于存储笔记ID long id = mWorkingNote.getNoteId(); - if (id != Notes.ID_ROOT_FOLDER) { + if (id != Notes.ID_ROOT_FOLDER) {// 如果笔记ID不是根文件夹ID,则将其添加到HashSet中 ids.add(id); - } else { + } else {// 如果笔记ID是根文件夹ID,则打印错误日志,因为这不该发生 Log.d(TAG, "Wrong note id, should not happen"); } - if (!isSyncMode()) { + if (!isSyncMode()) {// 如果不是同步模式,则执行删除操作 if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { Log.e(TAG, "Delete Note error"); } - } else { + } else {//如果是同步模式则将笔记移动到垃圾箱文件夹,如果失败则打印错误日志 if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { Log.e(TAG, "Move notes to trash folder error, should not happens"); } } } - mWorkingNote.markDeleted(true); + mWorkingNote.markDeleted(true);//标记当前笔记为已删除 } - + //判断是否处于同步模式 private boolean isSyncMode() { + //只需判断当前是否有账户名 return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } - + /** + * @classname: NoteEditActivity + * @methodname onClockAlertChanged + * @description: + * @date: 2023/12/25 21:34 + * @author: Xia Yanbo + * @param: + * @param: + * @param: + * @return: + */ public void onClockAlertChanged(long date, boolean set) { /** * User could set clock to an unsaved note, so before setting the * alert clock, we should save the note first */ if (!mWorkingNote.existInDatabase()) { - saveNote(); + saveNote();//不在数据库先保存 } if (mWorkingNote.getNoteId() > 0) { Intent intent = new Intent(this, AlarmReceiver.class); intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); - AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); + AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));//获取系统的闹钟服务 showAlertHeader(); - if(!set) { + if(!set) {//取消设置闹钟 alarmManager.cancel(pendingIntent); - } else { + } else {//设置闹钟 alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); } } else { @@ -644,26 +779,34 @@ public class NoteEditActivity extends Activity implements OnClickListener, * should input something */ Log.e(TAG, "Clock alert setting error"); - showToast(R.string.error_note_empty_for_clock); + showToast(R.string.error_note_empty_for_clock);//显示toast消息,用于提醒用户输入 } } - + //更新当前的控件 public void onWidgetChanged() { updateWidget(); } - + /** + * @classname: NoteEditActivity + * @methodname onEditTextDelete + * @description:删除正收编辑的文本 + * @date: 2023/12/25 21:41 + * @author: Xia Yanbo + * @param:text待移除的文本 + * @param:index要移除的子项的索引 + */ public void onEditTextDelete(int index, String text) { - int childCount = mEditTextList.getChildCount(); + int childCount = mEditTextList.getChildCount();//获取子项的数量 if (childCount == 1) { return; } - + // 将NoteEditText的索引更新为当前索引减1 for (int i = index + 1; i < childCount; i++) { ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) .setIndex(i - 1); } - mEditTextList.removeViewAt(index); + mEditTextList.removeViewAt(index);//移除指定索引号的子项 NoteEditText edit = null; if(index == 0) { edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( @@ -677,43 +820,44 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.requestFocus(); edit.setSelection(length); } - + //文本输入换行并更新文本存储列表的索引值 public void onEditTextEnter(int index, String text) { /** * Should not happen, check for debug */ if(index > mEditTextList.getChildCount()) { - Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); + Log.e(TAG, "Index out of mEditTextList boundrary, should not happen");//超出编辑列表的边界 } - + //根据索引和文本获取列表项视图 View view = getListItem(text, index); mEditTextList.addView(view, index); NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.requestFocus(); + edit.requestFocus();//设置焦点 edit.setSelection(0); + //文本编辑视图列表中的每一项设置索引值 for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) .setIndex(i); } } - + //切换到任务清单模式 private void switchToListMode(String text) { mEditTextList.removeAllViews(); String[] items = text.split("\n"); int index = 0; for (String item : items) { if(!TextUtils.isEmpty(item)) { - mEditTextList.addView(getListItem(item, index)); + mEditTextList.addView(getListItem(item, index));//添加列表项(标记:实现的关键步骤addView) index++; } } mEditTextList.addView(getListItem("", index)); mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); - mNoteEditor.setVisibility(View.GONE); - mEditTextList.setVisibility(View.VISIBLE); + mNoteEditor.setVisibility(View.GONE);//用于一般模式的编辑组件隐藏 + mEditTextList.setVisibility(View.VISIBLE);//用于任务清单模式的编辑组件显示 } - + //高亮显示用户查询的关键字 private Spannable getHighlightQueryResult(String fullText, String userQuery) { SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); if (!TextUtils.isEmpty(userQuery)) { @@ -721,7 +865,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, Matcher m = mPattern.matcher(fullText); int start = 0; while (m.find(start)) { - spannable.setSpan( + spannable.setSpan(//使用资源中的颜色(标记:可参考用作设计颜色) new BackgroundColorSpan(this.getResources().getColor( R.color.user_query_highlight)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); @@ -730,14 +874,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return spannable; } - + /** + * @classname: NoteEditActivity + * @methodname getListItem + * @description:根据给定的数据和索引值创建一个列表项视图 + * @date: 2023/12/26 23:52 + * @author: Xia Yanbo + * @param:item数据 + * @param:index索引值 + * @return:view 新创建的列表项视图 + */ private View getListItem(String item, int index) { + // 从当前上下文中加载NoteEditList_item布局文件,并返回一个View对象。 View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); + + // 获取NoteEditTextView组件 final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); + + // 设置文本的外观样式,使用传入的字体大小ID作为参数。 + edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));//标记,能改动文字大小的关键所在 + + // 获取CheckBox组件 CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); + + // 设置CheckBox的选中状态监听器 cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // 如果CheckBox被选中,则设置文本的绘制标志为删除线;否则设置为抗锯齿和文本对齐。 if (isChecked) { edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); } else { @@ -746,6 +909,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } }); + // 根据item的开头判断是否为已选或未选,并设置相应的CheckBox状态和文本绘制样式。 if (item.startsWith(TAG_CHECKED)) { cb.setChecked(true); edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); @@ -756,24 +920,29 @@ public class NoteEditActivity extends Activity implements OnClickListener, item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); } + // 设置NoteEditTextView的监听器为当前对象(this),以便在外部进行监听和处理。 edit.setOnTextViewChangeListener(this); + // 设置NoteEditTextView的索引值。 edit.setIndex(index); + // 为NoteEditTextView设置带有高亮显示的全文文本。使用传入的用户查询作为参数。 edit.setText(getHighlightQueryResult(item, mUserQuery)); + // 返回创建的列表项视图。 return view; } - + //文本变化时进行复选框的设置 public void onTextChange(int index, boolean hasText) { if (index >= mEditTextList.getChildCount()) { Log.e(TAG, "Wrong index, should not happen"); return; } + //设置复选框的出现与否 if(hasText) { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); } else { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); } } - + //进出任务清单模式时复选框等组件的设置 public void onCheckListModeChanged(int oldMode, int newMode) { if (newMode == TextNote.MODE_CHECK_LIST) { switchToListMode(mNoteEditor.getText().toString()); @@ -787,7 +956,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteEditor.setVisibility(View.VISIBLE); } } - + /** + * @classname: NoteEditActivity + * @methodname getWorkingText + * @description:对选中的文本项设置值为完成 + * @date: 2023/12/27 0:03 + * @author: Xia Yanbo + * @return:boolean表示文本项被设置成的完成状态 + */ private boolean getWorkingText() { boolean hasChecked = false; if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { @@ -806,11 +982,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, } mWorkingNote.setWorkingText(sb.toString()); } else { - mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); + mWorkingNote.setWorkingText(mNoteEditor.getText().toString());//不做标记值的更改 } return hasChecked; } - + //保存便签 private boolean saveNote() { getWorkingText(); boolean saved = mWorkingNote.saveNote(); @@ -826,7 +1002,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return saved; } - + //保存便签并发送到桌面 private void sendToDesktop() { /** * Before send message to home, we should make sure that current @@ -861,14 +1037,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, showToast(R.string.error_note_empty_for_send_to_desktop); } } - + //生成快捷方式图标的标题 private String makeShortcutIconTitle(String content) { content = content.replace(TAG_CHECKED, ""); content = content.replace(TAG_UNCHECKED, ""); return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, SHORTCUT_ICON_TITLE_MAX_LEN) : content; } - + //消息传递 private void showToast(int resId) { showToast(resId, Toast.LENGTH_SHORT); } diff --git a/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java index 39592b5..34fc9dd 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -38,14 +38,11 @@ import java.util.HashMap; import java.util.Map; /** * @classname: NoteEditText - * @methodname - * @description: + * @description:NoteEditText继承了 EditText父类 + * 负责开启监听以完成文本的读取,并做出相应的处理动作 + * 同时还负责上下文菜单的创建 * @date: 2023/12/24 9:22 * @author: Xia Yanbo - * @param: - * @param: - * @param: - * @return: */ public class NoteEditText extends EditText { private static final String TAG = "NoteEditText";//标签,分类接收特定信息