NoteEditActivity精读

pull/4/head
Ryuki 2 years ago
parent 6197e8ce68
commit 0c371247d5

@ -643,60 +643,75 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private void createNewNote() {
// Firstly, save current editing notes
// Firstly, save current editing notes 保存正在编辑的笔记
saveNote();
// For safety, start a new NoteEditActivity
// For safety, start a new NoteEditActivity 结束当前的编辑活动并启动新的编辑活动
finish();
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
//传递当前工作笔记所在的文件夹的ID到新的编辑活动
intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());
startActivity(intent);
}
//删除当前编辑的笔记
private void deleteCurrentNote() {
//检查工作笔记是否存在于数据库中
if (mWorkingNote.existInDatabase()) {
HashSet<Long> ids = new HashSet<Long>();
long id = mWorkingNote.getNoteId();
if (id != Notes.ID_ROOT_FOLDER) {
//如果不是根文件夹则加入到需要删除的笔记ID集合中
ids.add(id);
} else {
//不应该尝试删除根文件夹,记录错误信息
Log.d(TAG, "Wrong note id, should not happen");
}
//如果不存在同步模式,则直接删除笔记
if (!isSyncMode()) {
if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
Log.e(TAG, "Delete Note error");
}
} 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);
}
private boolean isSyncMode() {
//获取同步账号名如果长度大于0表明存在同步账号即处于同步模式
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
}
//更新跟笔记相关的闹钟
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) {
//创建一个AlarmReceiver的Intent将笔记ID附加到数据URI
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));
//显示提醒的头部信息
showAlertHeader();
if(!set) {
//如果set为false取消任何现有的闹钟
alarmManager.cancel(pendingIntent);
} else {
//如果set为true设置一个新的闹钟以唤醒设备并执行pendingIntent
alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
}
} else {
@ -705,41 +720,46 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* not worthy saving), we have no note id, remind the user that he
* should input something
*/
//如果笔记ID小于或等于0表示没有内容记录错误并显示提示
Log.e(TAG, "Clock alert setting error");
showToast(R.string.error_note_empty_for_clock);
}
}
//当小部件状态发生变化时的回调方法,可能是用来触发状态更新或视图刷新
public void onWidgetChanged() {
updateWidget();
updateWidget(); //更新小部件
}
//当编辑框中的文本被删除时的回调方法
public void onEditTextDelete(int index, String text) {
int childCount = mEditTextList.getChildCount();
if (childCount == 1) {
int childCount = mEditTextList.getChildCount();//获取编辑框列表的子项数量
if (childCount == 1) { //如果仅有一个编辑框,则不进行任何操作
return;
}
//更新后续编辑框的索引,因为一个项已经被删除
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) {
if(index == 0) { //如果删除的是第一个编辑框
edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById(
R.id.et_edit_text);
} else {
} else {//否则,获取欠一个编辑框
edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById(
R.id.et_edit_text);
}
//将删除的文本追加到当前聚焦的编辑框中
int length = edit.length();
edit.append(text);
edit.requestFocus();
edit.setSelection(length);
edit.requestFocus();//请求焦点
edit.setSelection(length);//设置光标位置
}
//当按下回车键时的回调方法,用于添加新的编辑框
public void onEditTextEnter(int index, String text) {
/**
* Should not happen, check for debug
@ -747,42 +767,47 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if(index > mEditTextList.getChildCount()) {
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.setSelection(0);
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");
mEditTextList.removeAllViews();//移除所有视图
String[] items = text.split("\n");//按换行符拆分文本成多个项
int index = 0;
for (String item : items) {
if(!TextUtils.isEmpty(item)) {
mEditTextList.addView(getListItem(item, index));
if(!TextUtils.isEmpty(item)) { //跳过空项
mEditTextList.addView(getListItem(item, index));//添加列表项
index++;
}
}
mEditTextList.addView(getListItem("", index));
mEditTextList.addView(getListItem("", index));//添加新的空编辑框
mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();
//切换视图的可见性
mNoteEditor.setVisibility(View.GONE);
mEditTextList.setVisibility(View.VISIBLE);
}
//获取高亮显示查询结果的方法
private Spannable getHighlightQueryResult(String fullText, String userQuery) {
//创建新的SpannableString实例
SpannableString spannable = new SpannableString(fullText == null ? "" : fullText);
if (!TextUtils.isEmpty(userQuery)) {
mPattern = Pattern.compile(userQuery);
Matcher m = mPattern.matcher(fullText);
mPattern = Pattern.compile(userQuery);//编译用户的查询文本为正则模式
Matcher m = mPattern.matcher(fullText);//对全文进行匹配搜索
int start = 0;
while (m.find(start)) {
//对匹配到的结果设置高亮背景颜色
spannable.setSpan(
new BackgroundColorSpan(this.getResources().getColor(
R.color.user_query_highlight)), m.start(), m.end(),
@ -790,16 +815,21 @@ public class NoteEditActivity extends Activity implements OnClickListener,
start = m.end();
}
}
return spannable;
return spannable;//返回包含高亮查询结果的Spannable
}
//根据给定的文本和索引创建新的列表项视图的方法
private View getListItem(String item, int index) {
//通过布局填充器创建列表项视图
View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);
final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
//设置文本外观
edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item));
//为复选框设置状态改变监听器
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//根据复选框状态改变文本样式,如添加删除线
if (isChecked) {
edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
@ -807,7 +837,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
});
//根据复选框的状态初始化编辑框的文本和样式
if (item.startsWith(TAG_CHECKED)) {
cb.setChecked(true);
edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
@ -818,17 +848,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
item = item.substring(TAG_UNCHECKED.length(), item.length()).trim();
}
edit.setOnTextViewChangeListener(this);
edit.setIndex(index);
edit.setOnTextViewChangeListener(this);//设置文本变化监听器
edit.setIndex(index);//设置编辑框的索引
//设置并显示高亮查询结果
edit.setText(getHighlightQueryResult(item, mUserQuery));
return view;
}
//当文本内容发生改变且编辑框不为空时,会显示或隐藏复选框的方法
public void onTextChange(int index, boolean hasText) {
if (index >= mEditTextList.getChildCount()) {
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 {
@ -836,6 +869,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
//当勾选列表模式发生改变时的回调方法
public void onCheckListModeChanged(int oldMode, int newMode) {
if (newMode == TextNote.MODE_CHECK_LIST) {
switchToListMode(mNoteEditor.getText().toString());

Loading…
Cancel
Save