From 07105431f7c9136c0c76fb06dccdbc48d5f6d9ae Mon Sep 17 00:00:00 2001 From: gq <15933486098@qq.com> Date: Thu, 15 May 2025 08:28:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BA=86=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E8=8F=9C=E5=8D=95=EF=BC=8C=E7=89=B9?= =?UTF-8?q?=E5=88=AB=E6=98=AF=E5=A4=84=E7=90=86URL=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/micode/notes/ui/NoteEditText.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteEditText.java index eb38037..694da48 100644 --- a/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -214,7 +214,7 @@ public class NoteEditText extends EditText { // 未被处理的按键事件交由父类处理 return super.onKeyUp(keyCode, event); } - + @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (mOnTextViewChangeListener != null) { @@ -227,39 +227,57 @@ public class NoteEditText extends EditText { super.onFocusChanged(focused, direction, previouslyFocusedRect); } + /** + * 创建上下文菜单(长按文本时弹出的菜单) + * 主要处理文本中的URL链接,为链接添加对应的菜单项 + */ @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); + // 从选中文本中提取URLSpan对象(超链接) final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + + // 如果只选中了一个URL链接 if (urls.length == 1) { - int defaultResId = 0; - for(String schema: sSchemaActionResMap.keySet()) { + int defaultResId = 0; // 默认菜单项资源ID + + // 遍历预定义的URL协议映射表 + for(String schema : sSchemaActionResMap.keySet()) { + // 检查当前URL是否包含特定协议(如http, mailto等) if(urls[0].getURL().indexOf(schema) >= 0) { + // 获取对应的菜单项文本资源ID defaultResId = sSchemaActionResMap.get(schema); break; } } + // 如果没有匹配的协议,使用默认"其他链接"菜单项 if (defaultResId == 0) { defaultResId = R.string.note_link_other; } + // 添加菜单项并设置点击监听器 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { - // goto a new intent + // 当菜单项被点击时,触发URL链接的默认行为 + // 比如打开浏览器或邮件客户端 urls[0].onClick(NoteEditText.this); - return true; + return true; // 表示事件已处理 } }); } } + + // 调用父类方法继续处理其他上下文菜单逻辑 super.onCreateContextMenu(menu); } -}