From a00d0d01019a225d642e07482c17b1ed5612ad71 Mon Sep 17 00:00:00 2001 From: AetherPendragon Date: Sat, 24 Jan 2026 12:42:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=8C=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainfests/AndroidManifest.xml | 1 - src/Notes-master/res/layout/note_edit.xml | 74 +-- .../res/values-zh-rCN/strings.xml | 7 - src/Notes-master/res/values/strings.xml | 7 - .../src/net/micode/notes/tool/DataUtils.java | 40 +- .../net/micode/notes/ui/NoteEditActivity.java | 435 ++---------------- 6 files changed, 60 insertions(+), 504 deletions(-) diff --git a/src/Notes-master/mainfests/AndroidManifest.xml b/src/Notes-master/mainfests/AndroidManifest.xml index e099d24..a85867b 100644 --- a/src/Notes-master/mainfests/AndroidManifest.xml +++ b/src/Notes-master/mainfests/AndroidManifest.xml @@ -17,7 +17,6 @@ - diff --git a/src/Notes-master/res/layout/note_edit.xml b/src/Notes-master/res/layout/note_edit.xml index c686d32..503fcb1 100644 --- a/src/Notes-master/res/layout/note_edit.xml +++ b/src/Notes-master/res/layout/note_edit.xml @@ -56,8 +56,16 @@ android:layout_marginRight="8dip" android:textAppearance="@style/TextAppearanceSecondaryItem" /> + + -<<<<<<< HEAD -======= ->>>>>>> master -<<<<<<< HEAD -======= ->>>>>>> master - - - - - - - - - - - - - @@ -323,9 +273,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" - android:layout_marginRight="2dip" android:focusable="false" android:visibility="gone" + android:layout_marginRight="2dip" android:src="@drawable/selected" /> diff --git a/src/Notes-master/res/values-zh-rCN/strings.xml b/src/Notes-master/res/values-zh-rCN/strings.xml index 67568ca..96599ab 100644 --- a/src/Notes-master/res/values-zh-rCN/strings.xml +++ b/src/Notes-master/res/values-zh-rCN/strings.xml @@ -84,13 +84,6 @@ 要查看的便签不存在 不能为空便签设置闹钟提醒 不能将空便签发送到桌面 -<<<<<<< HEAD -======= - 清单模式下不支持格式化 - 拒绝许可,无法访问图像 - 插入失败,请再尝试一次 - 请先选择文本 ->>>>>>> master 导出成功 导出失败 已将文本文件(%1$s)输出至SD卡(%2$s)目录 diff --git a/src/Notes-master/res/values/strings.xml b/src/Notes-master/res/values/strings.xml index bc9eb9a..170e4f0 100644 --- a/src/Notes-master/res/values/strings.xml +++ b/src/Notes-master/res/values/strings.xml @@ -88,13 +88,6 @@ The note is not exist Sorry, can not set clock on empty note Sorry, can not send and empty note to home -<<<<<<< HEAD -======= - Formatting is not supported in list mode - Please select text first - Permission denied, cannot access images - Failed to insert image, please try again ->>>>>>> master Export successful Export fail Export text file (%1$s) to SD (%2$s) directory diff --git a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java index 63b1790..717c14a 100644 --- a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java @@ -81,11 +81,11 @@ public class DataUtils { // Query the note from note table cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), null, null, null, null); - + if (cursor != null && cursor.moveToFirst()) { // Read all columns from the note ContentValues trashValues = new ContentValues(); - + // Copy all columns from note to trash for (String column : cursor.getColumnNames()) { int columnIndex = cursor.getColumnIndex(column); @@ -109,13 +109,12 @@ public class DataUtils { } } } - + // Set deleted_date to current time trashValues.put("deleted_date", System.currentTimeMillis()); - + // Insert into trash table resolver.insert(Notes.CONTENT_TRASH_URI, trashValues); -<<<<<<< HEAD // 在删除note之前,先备份DATA表的数据 if (db != null) { @@ -162,13 +161,9 @@ public class DataUtils { } // Delete from note table (this will trigger deletion of DATA table via trigger) -======= - - // Delete from note table ->>>>>>> master resolver.delete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), null, null); } - + if (cursor != null) { cursor.close(); cursor = null; @@ -207,7 +202,7 @@ public class DataUtils { } public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { + long folderId) { if (ids == null) { Log.d(TAG, "the ids is null"); return true; @@ -310,8 +305,8 @@ public class DataUtils { public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", new String[] { name }, null); boolean exist = false; if(cursor != null) { @@ -396,16 +391,12 @@ public class DataUtils { // Query the note from trash table cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_TRASH_URI, trashId), null, null, null, null); - + if (cursor != null && cursor.moveToFirst()) { // Read all columns from the trash note ContentValues noteValues = new ContentValues(); -<<<<<<< HEAD long originalNoteId = -1; -======= - ->>>>>>> master // Copy all columns from trash to note (except deleted_date) for (String column : cursor.getColumnNames()) { if ("deleted_date".equals(column)) { @@ -437,9 +428,8 @@ public class DataUtils { } } } - + // Insert back to note table -<<<<<<< HEAD Uri restoredUri = resolver.insert(Notes.CONTENT_NOTE_URI, noteValues); if (restoredUri == null) { Log.e(TAG, "Failed to restore note to note table"); @@ -508,13 +498,9 @@ public class DataUtils { } } -======= - resolver.insert(Notes.CONTENT_NOTE_URI, noteValues); - ->>>>>>> master // Delete from trash table resolver.delete(ContentUris.withAppendedId(Notes.CONTENT_TRASH_URI, trashId), null, null); - + return true; } return false; @@ -596,7 +582,7 @@ public class DataUtils { Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, new String [] { CallNote.NOTE_ID }, CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", + + CallNote.PHONE_NUMBER + ",?)", new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, null); @@ -634,8 +620,6 @@ public class DataUtils { public static String getFormattedSnippet(String snippet) { if (snippet != null) { snippet = snippet.trim(); - // 替换[IMAGE]标签为友好的占位符 - snippet = snippet.replaceAll("\\[IMAGE\\].*?\\[/IMAGE\\]", "[图片]"); int index = snippet.indexOf('\n'); if (index != -1) { snippet = snippet.substring(0, index); diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index 6115f83..7cfd52d 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -27,31 +27,14 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.PackageManager; import android.graphics.Paint; -import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.provider.MediaStore; import android.text.Spannable; import android.text.SpannableString; -import android.text.SpannableStringBuilder; import android.text.TextUtils; -<<<<<<< HEAD import android.text.format.DateUtils; import android.text.style.BackgroundColorSpan; -======= -import android.text.Editable; -import android.text.Html; -import android.text.format.DateUtils; -import android.text.style.BackgroundColorSpan; -import android.text.style.StyleSpan; -import android.text.style.UnderlineSpan; -import android.text.style.ImageSpan; -import java.util.regex.Pattern; -import java.util.regex.Matcher; ->>>>>>> master import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -64,25 +47,24 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import android.graphics.Typeface; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; +import android.widget.ImageButton; +import android.provider.MediaStore; +import android.net.Uri; +import java.io.File; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Editable; +import android.text.style.ImageSpan; import android.graphics.drawable.Drawable; import android.content.ContentResolver; import android.content.res.Resources; -<<<<<<< HEAD import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; -======= -// import android.support.annotation.NonNull; -import android.Manifest; ->>>>>>> master import java.io.InputStream; import java.io.FileOutputStream; import java.io.OutputStream; @@ -196,16 +178,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, private SharedPreferences mSharedPrefs; // 共享偏好设置 private int mFontSizeId; // 字体大小ID private ImageButton mBtnInsertImage; // 插入图片按钮 OMO -<<<<<<< HEAD private String mText; // 用于存储富文本内容 private int mNoteLength; // 文本长度 -======= - - // 富文本工具栏按钮 - private ImageButton mBtnBold; // 加粗按钮 - private ImageButton mBtnItalic; // 斜体按钮 - private ImageButton mBtnUnderline; // 下划线按钮 ->>>>>>> master private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; // 字体大小偏好设置键 private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; // 快捷图标标题最大长度 @@ -399,7 +373,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, // 获取笔记原始内容(为空则赋空字符串,避免空指针) String content = mWorkingNote.getContent() == null ? "" : mWorkingNote.getContent(); -<<<<<<< HEAD // 检查内容是否已经是HTML格式,如果是则直接加载 String finalHtml = content; @@ -432,28 +405,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } imgMatcher.appendTail(htmlContent); // 拼接剩余文本 finalHtml = htmlContent.toString(); -======= - if (TextUtils.isEmpty(content)) { - mNoteEditor.setText(""); - mNoteEditor.setSelection(0); - } else { - // 第一步:处理HTML编码字符,将&#xxx;转换为实际字符 - String decodedContent = content; - try { - // 使用Html.fromHtml解码HTML编码字符 - decodedContent = Html.fromHtml(content).toString(); - } catch (Exception e) { - Log.e(TAG, "Error decoding HTML content: " + e.getMessage()); - } - - // 第二步:处理[IMAGE]标签,将其转换为ImageSpan - SpannableString spannable = convertTextToSpannableWithImages(decodedContent); - - // 第三步:设置文本,确保文字和图片都能正常显示 - mNoteEditor.setText(spannable); - // 将光标定位到文本末尾 - mNoteEditor.setSelection(spannable.length()); ->>>>>>> master } // 用RichEditor加载HTML内容 @@ -492,8 +443,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return new SpannableString(""); } - Log.d(TAG, "Converting text to Spannable with images: " + text); - // 创建一个新的SpannableStringBuilder SpannableStringBuilder builder = new SpannableStringBuilder(); @@ -502,8 +451,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, int imageStart = text.indexOf("[IMAGE]", startIndex); while (imageStart != -1) { - Log.d(TAG, "Found [IMAGE] tag at position: " + imageStart); - // 添加[IMAGE]标签之前的文本 builder.append(text.substring(startIndex, imageStart)); @@ -515,97 +462,43 @@ public class NoteEditActivity extends Activity implements OnClickListener, break; } - Log.d(TAG, "Found [/IMAGE] tag at position: " + imageEnd); - // 提取图片URI String imageUri = text.substring(imageStart + "[IMAGE]".length(), imageEnd); - Log.d(TAG, "Extracted image URI: " + imageUri); + Log.d(TAG, "Found image URI: " + imageUri); - // 保留原始的[IMAGE]uri[/IMAGE]标签,直接在上面添加ImageSpan - String fullImageTag = "[IMAGE]" + imageUri + "[/IMAGE]"; - int tagStart = builder.length(); - builder.append(fullImageTag); + // 创建一个占位符字符串,用于插入ImageSpan + String placeholder = " "; + int placeholderStart = builder.length(); + builder.append(placeholder); // 尝试将图片URI转换为Drawable并创建ImageSpan try { - // 确保URI是有效的 - Uri uri = Uri.parse(imageUri); - if (uri == null) { - Log.e(TAG, "Invalid URI: " + imageUri); - // 更新索引,继续处理下一个标签 - startIndex = imageEnd + "[/IMAGE]".length(); - imageStart = text.indexOf("[IMAGE]", startIndex); - continue; - } - - Log.d(TAG, "Attempting to load image from URI: " + uri.toString()); - - // 使用BitmapFactory直接加载图片,这是最可靠的方式 ContentResolver resolver = getContentResolver(); - InputStream inputStream = null; - try { - inputStream = resolver.openInputStream(uri); - if (inputStream == null) { - Log.e(TAG, "Failed to open input stream for URI: " + uri.toString()); - // 更新索引,继续处理下一个标签 - startIndex = imageEnd + "[/IMAGE]".length(); - imageStart = text.indexOf("[IMAGE]", startIndex); - continue; - } - - // 解码图片 - Bitmap bitmap = BitmapFactory.decodeStream(inputStream); - if (bitmap == null) { - Log.e(TAG, "Failed to decode bitmap from URI: " + uri.toString()); - // 更新索引,继续处理下一个标签 - startIndex = imageEnd + "[/IMAGE]".length(); - imageStart = text.indexOf("[IMAGE]", startIndex); - continue; - } - - Log.d(TAG, "Successfully decoded bitmap with dimensions: " + bitmap.getWidth() + "x" + bitmap.getHeight()); - - // 计算图片的合适大小,确保它能适应EditText的宽度 - int screenWidth = getResources().getDisplayMetrics().widthPixels; - // 减去左右边距,确保图片能完整显示 - int maxWidth = screenWidth - 40; - int imageWidth = bitmap.getWidth(); - int imageHeight = bitmap.getHeight(); - - // 计算缩放比例 - float scale = 1.0f; - if (imageWidth > maxWidth) { - scale = (float) maxWidth / (float) imageWidth; - } - Log.d(TAG, "Calculated scale: " + scale); - - // 缩放图片(如果需要) - if (scale < 1.0f) { - bitmap = Bitmap.createScaledBitmap(bitmap, (int)(imageWidth * scale), (int)(imageHeight * scale), true); - Log.d(TAG, "Scaled bitmap to: " + bitmap.getWidth() + "x" + bitmap.getHeight()); - } - - // 创建Drawable并设置边界 - Drawable drawable = new android.graphics.drawable.BitmapDrawable(getResources(), bitmap); - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - - // 创建ImageSpan并添加到SpannableStringBuilder中 - ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); - builder.setSpan(imageSpan, tagStart, tagStart + fullImageTag.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); - Log.d(TAG, "Successfully added ImageSpan for URI: " + imageUri); - } finally { - // 确保InputStream被正确关闭 - if (inputStream != null) { - try { - inputStream.close(); - } catch (Exception e) { - Log.e(TAG, "Error closing input stream: " + e.toString()); - } - } - } + InputStream inputStream = resolver.openInputStream(Uri.parse(imageUri)); + Bitmap bitmap = BitmapFactory.decodeStream(inputStream); + inputStream.close(); + + // 计算图片的合适大小,确保它能适应EditText的宽度 + int screenWidth = getResources().getDisplayMetrics().widthPixels; + int imageWidth = bitmap.getWidth(); + int imageHeight = bitmap.getHeight(); + float scale = (float) screenWidth / (float) imageWidth; + int scaledHeight = (int) (imageHeight * scale); + + // 缩放图片 + Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, screenWidth, scaledHeight, true); + Drawable drawable = new android.graphics.drawable.BitmapDrawable(getResources(), scaledBitmap); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + + // 创建ImageSpan并添加到SpannableStringBuilder中 + ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); + builder.setSpan(imageSpan, placeholderStart, placeholderStart + placeholder.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); } catch (Exception e) { Log.e(TAG, "Error loading image: " + e.toString()); - e.printStackTrace(); + // 如果加载图片失败,直接显示图片URI + builder.append("[IMAGE]"); + builder.append(imageUri); + builder.append("[/IMAGE]"); } // 更新索引,继续查找下一个[IMAGE]标签 @@ -616,7 +509,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, // 添加剩余的文本 builder.append(text.substring(startIndex)); - Log.d(TAG, "Final SpannableStringBuilder content: " + builder.toString()); return new SpannableString(builder); } @@ -787,28 +679,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (mBtnInsertImage != null) { mBtnInsertImage.setOnClickListener(this); } -<<<<<<< HEAD // 初始化富文本功能按钮 initRichEditorButtons(); -======= - - // 初始化富文本工具栏按钮 - mBtnBold = (ImageButton) findViewById(R.id.btn_bold); - mBtnItalic = (ImageButton) findViewById(R.id.btn_italic); - mBtnUnderline = (ImageButton) findViewById(R.id.btn_underline); - - // 为富文本工具栏按钮设置点击监听器 - if (mBtnBold != null) { - mBtnBold.setOnClickListener(this); - } - if (mBtnItalic != null) { - mBtnItalic.setOnClickListener(this); - } - if (mBtnUnderline != null) { - mBtnUnderline.setOnClickListener(this); - } ->>>>>>> master } /** @@ -1395,17 +1268,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, } mWorkingNote.setWorkingText(sb.toString()); } else { -<<<<<<< HEAD // 确保获取最新的富文本内容 String currentHtml = mNoteEditor.getHtml(); mWorkingNote.setWorkingText(currentHtml); mText = currentHtml; // 更新mText变量,确保保存时使用最新内容 -======= - // 对于普通模式,直接保存EditText中的原始文本 - // 这样可以保留[IMAGE]标签,确保图片信息不会丢失 - String content = mNoteEditor.getText().toString(); - mWorkingNote.setWorkingText(content); ->>>>>>> master } return hasChecked; } @@ -1502,10 +1368,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** * 从相册选择图片 OMO */ - private static final int REQUEST_CODE_PERMISSION_STORAGE = 101; - private void pickImageFromGallery() { -<<<<<<< HEAD try { // 意图:打开系统相册选择图片 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); @@ -1520,36 +1383,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } catch (ActivityNotFoundException ex) { showToast(R.string.error_note_not_exist); Log.e(TAG, "No image picker available", ex); -======= - // 检查并申请存储权限 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - // 申请权限 - requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION_STORAGE); - } else { - // 权限已授予,直接选择图片 - Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); - } - } else { - // Android 6.0以下版本,直接选择图片 - Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); - } - } - - // 处理权限请求结果 - @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_CODE_PERMISSION_STORAGE) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // 权限被授予,执行图片选择 - pickImageFromGallery(); - } else { - // 权限被拒绝,显示提示 - showToast(R.string.error_permission_denied); ->>>>>>> master } } } @@ -1560,7 +1393,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); -<<<<<<< HEAD if (requestCode == PHOTO_REQUEST && resultCode == RESULT_OK && data != null) { Uri uri = data.getData(); String localImagePath = saveImageToLocal(uri); @@ -1606,60 +1438,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, }); builder.show(); -======= - if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK && data != null) { - Log.d(TAG, "Image selected successfully, data: " + data.toString()); - Uri imageUri = data.getData(); - if (imageUri != null) { - Log.d(TAG, "Image URI: " + imageUri.toString()); - - // 获取当前编辑器内容 - Editable editable = mNoteEditor.getText(); - int currentPosition = mNoteEditor.getSelectionStart(); - - try { - // 1. 保存当前编辑器的原始内容,用于后续恢复 - String originalContent = editable.toString(); - int originalSelection = mNoteEditor.getSelectionStart(); - - // 2. 插入完整的[IMAGE]uri[/IMAGE]标签到原始内容中 - String imagePath = "[IMAGE]" + imageUri.toString() + "[/IMAGE]"; - StringBuilder sb = new StringBuilder(originalContent); - sb.insert(originalSelection, imagePath); - String newContentWithTags = sb.toString(); - - // 3. 首先将包含ImageSpan的SpannableString显示到编辑器中 - SpannableString spannable = convertTextToSpannableWithImages(newContentWithTags); - mNoteEditor.setText(spannable); - - // 4. 然后将原始的[IMAGE]标签内容设置到WorkingNote中 - mWorkingNote.setWorkingText(newContentWithTags); - - // 5. 保存笔记(注意:这里不再调用getWorkingText(),而是直接保存WorkingNote中的内容) - // 我们需要修改saveNote()方法,或者直接调用mWorkingNote.saveNote() - if (mWorkingNote.saveNote()) { - showToast(R.string.info_image_inserted); - } else { - showToast(R.string.error_image_insert_failed); - } - - // 6. 将光标移动到图片后面 - int newPosition = originalSelection + imagePath.length(); - mNoteEditor.setSelection(newPosition); - - } catch (Exception e) { - Log.e(TAG, "Error inserting image: " + e.toString()); - e.printStackTrace(); - // 如果插入图片失败,显示错误信息 - showToast(R.string.error_image_insert_failed); - } - } else { - Log.e(TAG, "Image URI is null"); - showToast(R.string.error_image_insert_failed); - } - } else { - Log.d(TAG, "Image selection canceled or failed, resultCode: " + resultCode); ->>>>>>> master } } @@ -1692,147 +1470,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, Toast.makeText(this, "图片保存失败", Toast.LENGTH_SHORT).show(); return null; } -<<<<<<< HEAD -======= - - // 检查是否在清单模式,如果是则提示用户切换到普通模式 - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - showToast(R.string.error_formatting_not_supported_in_list_mode); - return; - } - - Editable editable = mNoteEditor.getText(); - if (editable == null) { - return; - } - - int selectionStart = mNoteEditor.getSelectionStart(); - int selectionEnd = mNoteEditor.getSelectionEnd(); - - // 如果没有选中文本,则选中光标所在的单词或当前字符 - if (selectionStart == selectionEnd) { - // 尝试选中光标所在的单词 - String text = editable.toString(); - int start = selectionStart; - int end = selectionEnd; - - // 向前查找单词开始位置 - while (start > 0 && Character.isLetterOrDigit(text.charAt(start - 1))) { - start--; - } - - // 向后查找单词结束位置 - while (end < text.length() && Character.isLetterOrDigit(text.charAt(end))) { - end++; - } - - // 如果找到了单词,则选中它;否则选中当前字符 - if (start < end) { - selectionStart = start; - selectionEnd = end; - mNoteEditor.setSelection(selectionStart, selectionEnd); - } else { - // 如果没有找到单词,提示用户先选择文本 - showToast(R.string.error_please_select_text); - return; - } - } - - // 确保选择范围有效 - if (selectionStart < 0 || selectionEnd > editable.length() || selectionStart >= selectionEnd) { - showToast(R.string.error_please_select_text); - return; - } - - // 应用样式 - if (styleType == -1) { - // 下划线样式 - UnderlineSpan[] underlineSpans = editable.getSpans(selectionStart, selectionEnd, UnderlineSpan.class); - if (underlineSpans.length > 0) { - // 移除下划线 - for (UnderlineSpan span : underlineSpans) { - int spanStart = editable.getSpanStart(span); - int spanEnd = editable.getSpanEnd(span); - editable.removeSpan(span); - // 如果移除的span范围大于选中范围,需要重新应用样式到剩余部分 - if (spanStart < selectionStart) { - editable.setSpan(new UnderlineSpan(), spanStart, selectionStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - if (spanEnd > selectionEnd) { - editable.setSpan(new UnderlineSpan(), selectionEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } - } else { - // 添加下划线 - editable.setSpan(new UnderlineSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } else { - // 加粗或斜体样式 - StyleSpan[] styleSpans = editable.getSpans(selectionStart, selectionEnd, StyleSpan.class); - - // 检查选中范围内是否已经有该样式 - boolean hasStyle = false; - int existingStyle = 0; - - // 收集选中范围内的所有样式 - for (StyleSpan span : styleSpans) { - int spanStart = editable.getSpanStart(span); - int spanEnd = editable.getSpanEnd(span); - - // 如果span与选中范围重叠 - if (spanStart < selectionEnd && spanEnd > selectionStart) { - int spanStyle = span.getStyle(); - existingStyle |= spanStyle; - - // 检查是否包含目标样式 - if ((spanStyle & styleType) == styleType) { - hasStyle = true; - } - } - } - - // 移除选中范围内的所有StyleSpan,以便重新应用 - for (int i = styleSpans.length - 1; i >= 0; i--) { - StyleSpan span = styleSpans[i]; - int spanStart = editable.getSpanStart(span); - int spanEnd = editable.getSpanEnd(span); - - // 如果span与选中范围重叠 - if (spanStart < selectionEnd && spanEnd > selectionStart) { - editable.removeSpan(span); - - // 处理span范围大于选中范围的情况,保留未选中部分的样式 - int spanStyle = span.getStyle(); - if (spanStart < selectionStart) { - // 保留选中范围之前的样式 - editable.setSpan(new StyleSpan(spanStyle), spanStart, selectionStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - if (spanEnd > selectionEnd) { - // 保留选中范围之后的样式 - editable.setSpan(new StyleSpan(spanStyle), selectionEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } - } - - // 切换样式:如果有则移除,如果没有则添加 - int finalStyle = existingStyle; - if (hasStyle) { - // 移除目标样式 - finalStyle &= ~styleType; - } else { - // 添加目标样式 - finalStyle |= styleType; - } - - // 应用最终样式 - if (finalStyle != 0) { - editable.setSpan(new StyleSpan(finalStyle), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } - - // 保持选中状态 - mNoteEditor.setSelection(selectionStart, selectionEnd); ->>>>>>> master } // 自定义方法:给RichEditor设置字体大小(对应原EditText的setTextAppearance)