Merge pull request '完整版提交' (#32) from wangyijia_branch into master

master
p6vxzahlf 3 weeks ago
commit 97f113e7c6

@ -16,7 +16,9 @@
package net.micode.notes.ui;
import android.app.Activity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
@ -120,7 +122,7 @@ import java.util.Map;
import java.util.HashMap;
public class NoteEditActivity extends Activity implements OnClickListener,
public class NoteEditActivity extends AppCompatActivity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener, OnSelectionChangeListener {
private class HeadViewHolder {
public TextView tvModified;
@ -366,6 +368,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private HeadViewHolder mNoteHeaderHolder;
private TextView mTvEmotion;
private View mHeadViewPanel;
private View mNoteBgColorSelector;
@ -449,6 +453,35 @@ public class NoteEditActivity extends Activity implements OnClickListener,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_edit);
if (toolbar != null) {
// ensure toolbar title is visible and matches theme
try {
toolbar.setTitleTextColor(ContextCompat.getColor(this, android.R.color.white));
} catch (Exception ignored) {}
toolbar.setVisibility(View.VISIBLE);
toolbar.bringToFront();
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// try to ensure overflow icon visible
try {
toolbar.setOverflowIcon(ContextCompat.getDrawable(this, android.R.drawable.ic_menu_more));
} catch (Exception ignored) {}
try {
toolbar.inflateMenu(R.menu.note_edit);
} catch (Exception e) {
// fail silently if menu resource not found
}
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return NoteEditActivity.this.onOptionsItemSelected(item);
}
});
}
if (savedInstanceState == null && !initActivityState(getIntent())) {
finish();
@ -1283,20 +1316,48 @@ public class NoteEditActivity extends Activity implements OnClickListener,
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
}
if (mWorkingNote.hasClockAlert()) {
menu.findItem(R.id.menu_alert).setVisible(false);
MenuItem alertItem = menu.findItem(R.id.menu_alert);
if (alertItem != null) {
alertItem.setVisible(false);
}
} else {
menu.findItem(R.id.menu_delete_remind).setVisible(false);
MenuItem deleteRemindItem = menu.findItem(R.id.menu_delete_remind);
if (deleteRemindItem != null) {
deleteRemindItem.setVisible(false);
}
}
// 习惯相关菜单处理
boolean isHabit = mWorkingNote.isHabit();
menu.findItem(R.id.menu_set_habit).setVisible(!isHabit);
menu.findItem(R.id.menu_habit_settings).setVisible(isHabit);
menu.findItem(R.id.menu_stop_habit).setVisible(isHabit);
MenuItem setHabitItem = menu.findItem(R.id.menu_set_habit);
if (setHabitItem != null) {
setHabitItem.setVisible(!isHabit);
}
MenuItem habitSettingsItem = menu.findItem(R.id.menu_habit_settings);
if (habitSettingsItem != null) {
habitSettingsItem.setVisible(isHabit);
}
MenuItem stopHabitItem = menu.findItem(R.id.menu_stop_habit);
if (stopHabitItem != null) {
stopHabitItem.setVisible(isHabit);
}
// pinned menu
MenuItem pinItem = menu.findItem(R.id.menu_pin);
if (pinItem != null) {
if (mWorkingNote.isPinned()) {
pinItem.setTitle(R.string.menu_unpin);
} else {
pinItem.setTitle(R.string.menu_pin);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
switch (item.getItemId()) {
case R.id.menu_new_note://新建笔记
createNewNote();
@ -1345,6 +1406,18 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mWorkingNote.setHabit(true, "");
showHabitConfigDialog();
break;
case R.id.menu_pin:
boolean newState = !mWorkingNote.isPinned();
mWorkingNote.setPinned(newState);
mWorkingNote.saveNote();
setResult(RESULT_OK);
invalidateOptionsMenu();
if (newState) {
Toast.makeText(this, R.string.pinned_label, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, R.string.menu_unpin, Toast.LENGTH_SHORT).show();
}
break;
case R.id.menu_habit_settings:
// 显示习惯设置对话框
showHabitConfigDialog();
@ -1378,6 +1451,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mImageInsertHelper.startPickImage();
}
break;
default:
break;
}
@ -1634,27 +1708,30 @@ public class NoteEditActivity extends Activity implements OnClickListener,
focused.findViewById(R.id.et_edit_text).requestFocus();
} else {
// 普通模式下,直接显示翻译结果
SpannableString spannable = new SpannableString(result);
// 构建 HTML 格式的字符串,使用 <span> 标签来设置翻译结果的颜色
StringBuilder htmlBuilder = new StringBuilder();
// 分析文本结构:原文和翻译交替出现
// 格式原文1\n翻译1\n原文2\n翻译2\n...
String[] lines = result.split("\n");
int currentPosition = 0;
boolean isTranslation = false;
for (String line : lines) {
if (!TextUtils.isEmpty(line)) {
if (isTranslation) {
// 设置翻译结果为浅灰色
int start = currentPosition;
int end = currentPosition + line.length();
spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#999999")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
htmlBuilder.append("<span style=\"color:#999999;\">");
htmlBuilder.append(line);
htmlBuilder.append("</span>");
} else {
// 原文保持默认颜色
htmlBuilder.append(line);
}
isTranslation = !isTranslation;
}
currentPosition += line.length() + 1; // +1 for newline
htmlBuilder.append("<br>");
}
mNoteEditor.setHtml(spannable.toString());
mNoteEditor.setHtml(htmlBuilder.toString());
// scroll to first translation
// RichEditor doesn't support setSelection method, so we skip this
}
@ -1809,6 +1886,27 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor.setVisibility(View.GONE);//隐藏编辑框
mEditTextList.setVisibility(View.VISIBLE);
// 更新列表模式下的字符统计
updateListModeCharCount();
}
// 更新列表模式下的字符统计
private void updateListModeCharCount() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
View child = mEditTextList.getChildAt(i);
EditText et = (EditText) child.findViewById(R.id.et_edit_text);
if (et != null) {
String text = et.getText().toString();
if (!TextUtils.isEmpty(text)) {
sb.append(text).append("\n");
}
}
}
String listText = sb.toString();
int charCount = calcVisibleCharCount(listText);
mNoteHeaderHolder.tvCharNum.setText("字符数:" + charCount);
}
private Spannable getHighlightQueryResult(String fullText, String userQuery) {
@ -1906,6 +2004,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//清除删除线效果
}
// 复选框状态变化时也更新字符统计
updateListModeCharCount();
}
});
@ -1922,6 +2022,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
edit.setOnTextViewChangeListener(this);
//新增选区变化回调接口设置
edit.setOnSelectionChangeListener(this);
// 添加文本变化监听器,用于更新字符统计
edit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 更新列表模式下的字符统计
updateListModeCharCount();
}
@Override
public void afterTextChanged(Editable s) {}
});
edit.setIndex(index);
edit.setText(getHighlightQueryResult(item, mUserQuery));
return view;

Loading…
Cancel
Save