【Harmony】文本公共接口EditMenuOptions的使用

news2025/4/20 14:22:58

文章目录

  • 一、EditMenuOptions介绍
  • 二、相关接口介绍
    • 2.1、editMenuOptions
    • 2.2、EditMenuOptions
      • onCreateMenu函数说明
      • onMenuItemClick函数说明
    • 2.3、TextRange对象说明
    • 2.4、TextMenuItem对象说明
    • 2.5、TextMenuItemId
      • 属性
      • of
      • equals
  • 三、简单案例

一、EditMenuOptions介绍

EditMenuOptions用于设置自定义菜单扩展项,允许用户设置扩展项的文本内容、图标、回调方法。支持的组件:Text,TextArea,TextInput,RichEditor,Search。

在最新的API15/16中,TextMenuItemId接口新增了TRANSLATE属性值,通过结合自定义菜单项,可以实现更为丰富的功能。

二、相关接口介绍

2.1、editMenuOptions

设置自定义菜单扩展项

editMenuOptions(editMenu: EditMenuOptions)
参数名类型必填说明
editMenuEditMenuOptions扩展菜单选项。

2.2、EditMenuOptions

onCreateMenu函数说明

onCreateMenu(menuItems: Array<TextMenuItem>): Array<TextMenuItem>

菜单数据模版编辑能力。

参数:

参数名类型必填说明
menuItemsArray<TextMenuItem>菜单项。**说明:**对默认菜单项的名称修改不生效。

返回值:

类型说明
Array<TextMenuItem>设置的菜单项。**说明:**不返回系统默认菜单项的图标。

onMenuItemClick函数说明

onMenuItemClick(menuItem: TextMenuItem, range: TextRange): boolean

菜单项功能函数。

参数:

参数名类型必填说明
menuItemTextMenuItem菜单项。
rangeTextRange选中的文本信息。

返回值:

类型说明
boolean菜单项的执行逻辑。返回为true,拦截系统默认逻辑,仅执行自定义逻辑。返回为false,先执行自定义逻辑,再执行系统逻辑。

2.3、TextRange对象说明

//举例:声明一个TextRange对象
let range:TextRange={
    start:1,//用户选中文本开始的位置的索引,这里的1代表选中这段文本开始的字符位置索引
    end:3//用户选中文本结束的位置的索引,这里的3代表选中这段文本结束的字符位置索引
}
//例如一个文本,”我喜欢编程“,那么选中的文字就是“喜欢”
名称类型必填说明
startnumber起始索引。
endnumber结束索引。

2.4、TextMenuItem对象说明

//举例:声明一个TextMenuItem对象
let itemForward:TextMenuItem = {
    content: "转发",//必填 文本内容
    icon: $r("app.media.startIcon"),//选填 图标,注意:这里资源不支持网络图片
    id: TextMenuItemId.of("itemForward"), //必填 字符串/资源菜单id。
    //labelInfo?: ResourceStr; //选填 快捷键提示,例如复制项的提示是"Ctrl+C"。注意:该字段仅2in1设备支持
}
名称类型必填说明
contentResourceStr菜单名称。
iconResourceStr菜单图标。不支持网络图片。
idTextMenuItemId菜单id。
labelInfo15+ResourceStr快捷键提示。该字段仅2in1设备支持。元服务API: 从API version 15开始,该接口支持在元服务中使用。

2.5、TextMenuItemId

自定义菜单项的Id值。用于识别菜单选项,内置菜单项Id值见下列属性表格。

属性

名称类型只读可选说明
CUTTextMenuItemId默认裁剪。
COPYTextMenuItemId默认复制。
PASTETextMenuItemId默认粘贴。
SELECT_ALLTextMenuItemId默认全选。
COLLABORATION_SERVICETextMenuItemId互通服务。
CAMERA_INPUTTextMenuItemId拍摄输入。
AI_WRITER13+TextMenuItemId可对选中的文本进行润色、摘要提取、排版等。该菜单项依赖大模型能力,否则不生效。
TRANSLATE15+TextMenuItemId对选中的文本提供翻译服务。

of

static of(id: ResourceStr): TextMenuItemId//静态方法,通过传入id创建TextMenuItemId。

//举例:创建一个id为column的TextMenuItemId
let textMenuItemId =TextMenuItemId.of("column")

参数:

参数名类型必填说明
idResourceStr菜单的id。

返回值:

类型说明
TextMenuItemIdTextMenuItemId的对象。

equals

equals(id: TextMenuItemId): boolean//通过传入id比较是否相等,需要通过类型为TextMenuItemId的对象调用。

//举例:判断TextMenuItemId是否相等。
let textMenuItemId =TextMenuItemId.of("column")
let result= textMenuItemId.equals("column2")//result结果为:false

参数:

参数名类型必填说明
idTextMenuItemIdTextMenuItemId的id。

返回值:

类型说明
boolean两个TextMenuItemId是否相等。true表示相等,false表示不相等。

三、简单案例

import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  
  onCreateMenu = (menuItems: TextMenuItem[]):TextMenuItem[] =>{
    //1.这个传入的数组每项类型是TextMenuItem,我们随便定义三项:“转发“,"撤回","引用"
    //1.1“转发“
    let itemForward:TextMenuItem = {
      content: "转发",//必填 文本内容
      icon: $r("app.media.startIcon"),//选填 图标,注意:这里资源不支持网络图片
      id: TextMenuItemId.of("itemForward"), //必填 字符串/资源菜单id。
      //labelInfo?: ResourceStr; //选填 快捷键提示,例如复制项的提示是"Ctrl+C"。注意:该字段仅2in1设备支持
    }
    //1.2"撤回"
    let itemWithdraw:TextMenuItem ={
      content: "撤回",
      icon: $r("app.media.startIcon"),
      id: TextMenuItemId.of("itemWithdraw"),
    }
    //1.3"引用"
    let itemReferences:TextMenuItem ={
      content: "引用",
      icon: $r("app.media.startIcon"),
      id: TextMenuItemId.of("itemReferences"),
    }
    //2.将上面定义的三个菜单项,添加到传入的数组中,如果菜单项多就循环添加
    menuItems.push(itemForward)
    menuItems.push(itemWithdraw)
    menuItems.push(itemReferences)
    //3.返回传入的数组
    return menuItems
  }
  onMenuItemClick = (menuItem: TextMenuItem, range: TextRange): boolean =>{
    //这里返回值是true还是false不影响我们自定义的菜单项,因为无论是是true还是false我们自定义拦截的逻辑都会执行
    //这里的返回值是true还是false针对的是系统内置的菜单项,比如"复制","翻译","全选"这类菜单项,
    //这些系统内置的菜单项有自己的逻辑实现,我们通过TextMenuItemId也可以拦截系统内置的菜单项添加我们的逻辑,比如在"翻译"之前我想添加一个窗口,
    //用于用户选择翻译哪国语言,这种情况我们需要拦截"翻译"菜单项,然后添加窗口实现,然后通过返回false,先执行自定义逻辑,再执行系统逻辑。
    //如果返回的是true,那么只会执行我们的逻辑,系统逻辑就被拦截了不会执行。相当于重写

    
    //拦截自定义菜单项"转发"
    if(menuItem.id.equals(TextMenuItemId.of("itemForward"))){
      //TODO:转发的逻辑。。。
      return true;//这里返回值无所谓,什么都行
    }
    //拦截自定义菜单项"引用"
    if(menuItem.id.equals(TextMenuItemId.of("itemReferences"))){
      //TODO:引用的逻辑。。。
      return false;//这里返回值无所谓,什么都行
    }

    //拦截系统内置菜单项”翻译“
    if(menuItem.id.equals(TextMenuItemId.of("OH_DEFAULT_TRANSLATE"))){
      //TODO:翻译的逻辑。。。
      promptAction.showDialog({message:"翻译之前的窗口:中文,英文,日文"})

      return false;//这里需要返回false,让自定义逻辑在系统逻辑之前执行。
    }

    //拦截系统内置菜单项”全选“
    if(menuItem.id.equals(TextMenuItemId.of("OH_DEFAULT_SELECT_ALL"))){
      //TODO:重写全选的逻辑
      promptAction.showToast({message:"全选失效了,因为被我拦截了"})
      return true;//这里返回true,系统逻辑就不会执行,而是执行我们的逻辑。
    }

    return false
  }
  
  //EditMenuOptions接口里面定义的是两个回调方法,这里可以直接选择在箭头函数中实现,也也可在外部定义通过引用传递
  //参数1:onCreateMenu(menuItems: Array<TextMenuItem>): Array<TextMenuItem>;这个方法我们需要操作他传入的参数
  //menuItems这个数组,向这个数组添加菜单项,然后返回这个数组。
  //参数2:onMenuItemClick(menuItem: TextMenuItem, range: TextRange): boolean;这个方法用于我们实现操作菜单
  //项的逻辑实现,其中menuItem是传入的菜单项,range是选中文本的信息。这个方法每次调用会给我们返回一个布尔值
  //返回为true,拦截系统默认逻辑,仅执行自定义逻辑。
  //返回为false,先执行自定义逻辑,再执行系统逻辑。
  @State editMenu:EditMenuOptions = {
    onCreateMenu:this.onCreateMenu,
    onMenuItemClick:this.onMenuItemClick
  }
  
  build() {
     Column() {
       Text("文本扩展自定义菜单")
         .fontSize(30)
         .width("100%")
         .textAlign(TextAlign.Center)
         .copyOption(CopyOptions.LocalDevice)//实现自定义菜单项建议搭配copyOption实现
         .editMenuOptions(this.editMenu) //需要传递一个EditMenuOptions类型的参数,此处选择在外部定义editMenu
     }
    .width("100%")
  }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《软件设计师》复习笔记(14.1)——面向对象基本概念、分析设计测试

目录 一、面向对象基本概念 对象&#xff08;Object&#xff09; 类&#xff08;Class&#xff09; 抽象&#xff08;Abstraction&#xff09; 封装&#xff08;Encapsulation&#xff09; 继承&#xff08;Inheritance&#xff09; 多态&#xff08;Polymorphism&#…

JS中实现类似sleep、wait、delay的延时功能

前言 编写代码时很多时候需要进行流程化的操作&#xff0c;各个流程间通常需要等待一定时间&#xff0c;这在很多语言中通常可以使用 sleep 、 wait 、 delay 等函数来实现。JavaScript原生并没有类似的功能&#xff0c;想要延时通常就是使用 setTimeout(functionRef, delay) …

Banana Pi BPI-RV2 RISC-V 路由器开发板发售, 全球首款RISC-V路由器

Banana Pi BPI-RV2 开源路由器是矽昌通信和⾹蕉派开源社区&#xff08;Banana Pi &#xff09;合作设计, 联合打造全球首款RISC-V架构路由器开发板。 这是香蕉派开源社区与矽昌通信继BPI-Wifi5 低成本Wifi5 路由器合作之后的又一力作&#xff0c;为全球开发者与商业客户提供基于…

MAUI项目iOS应用以进 App Store 分发

目录 一.通过Visual Studio分发应用1. 登录Apple 开发者帐户到 Visual Studio2.创建分发证书和配置文件3. 分发应用4. 在App Store Connect 中创建应用程序记录5. 如果你想使用mac发布应用 一.通过Visual Studio分发应用 1. 登录Apple 开发者帐户到 Visual Studio 首先我们要…

CentOS 7系统yum报错解决方案(CentOS 7官方EOL问题修复)

摘要 解决CentOS 7因EOL导致的yum update报错问题&#xff0c;通过替换阿里云镜像源恢复软件安装功能&#xff0c;包含详细操作步骤、操作截图、验证方法与备选镜像源&#xff0c;附有安全风险提示。 一、故障现象与原因分析 1.1 典型报错信息 # 执行yum命令时出现&#xff…

解决Windows update服务启动拒绝访问的问题 | wuauserv 注册表拒绝访问的方法

在某些情况下,为了配置系统更新相关服务(例如禁用 Windows 自动更新),我们需要更改注册表中 wuauserv 项的权限。本教程将带你一步步操作,成功获取并修改权限。 修改注册表路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv 步骤一:打开注册表编辑…

深入解析 JDK jstack 命令:线程分析的利器

你点赞了吗&#xff1f;你关注了吗&#xff1f;每天分享干货好文。 高并发解决方案与架构设计。 海量数据存储和性能优化。 通用框架/组件设计与封装。 如何设计合适的技术架构&#xff1f; 如何成功转型架构设计与技术管理&#xff1f; 在竞争激烈的大环境下&#xff0c…

【操作系统原理03】处理机调度与死锁

文章目录 大纲一.处理机调度概念与层次0.大纲1.基本概念2.三个层次3.七状态模型4.三层调度都对比与联系 二.进程调度的时机&#xff0c;切换与过程的调度方式0.大纲1.进程调度时机2.调度方式3.进程的切换与过程 三.调度器和闲逛资源1.调度器/调度程序2.闲逛进程 四.调度算法的评…

Quipus,LightRag的Go版本的实现

1 项目简介 奇谱系统当前版本以知识库为核心&#xff0c;基于知识库可以快构建自己的问答系统。知识库的Rag模块的构建算法是参考了LightRag的算法流程的Go版本优化实现&#xff0c;它可以帮助你快速、准确地构建自己的知识库&#xff0c;搭建属于自己的AI智能助手。与当前LLM…

使用 Vite 快速搭建现代化 React 开发环境

1.检查环境 说明&#xff1a;检测环境&#xff0c;node版本为18.20.6。 2.创建命令 说明&#xff1a;创建命令&#xff0c;选择对应的选项。 npm create vitelatest 3.安装依赖 说明&#xff1a;安装相关依赖。 npm i

PG数据库推进医疗AI向量搜索优化路径研究(2025年3月修订版)

PG数据库推进医疗AI向量搜索优化路径研究 一、医疗 AI 向量搜索的发展现状与挑战 1.1 医疗数据特征与检索需求 医疗数据作为推动医疗领域进步与创新的关键要素,具有鲜明且复杂的特征。从多模态角度看,医疗数据涵盖了结构化数据,如患者基本信息、检验检查报告中的数值结果;…

可穿戴经颅多通道直流电刺激产品测试总结

一 概念原理 tDCS 是一种非侵入性的神经调节技术&#xff0c;利用恒定、低强度直流电&#xff08;通常为 0 - 2mA&#xff09;通过电极作用于特定的大脑区域。其工作原理是通过调节神经元的膜电位&#xff0c;来增加或降低神经元兴奋性的特定区域&#xff0c;从而改变大脑运作。…

详解与HTTP服务器相关操作

HTTP 服务器是一种遵循超文本传输协议&#xff08;HTTP&#xff09;的服务器&#xff0c;用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍&#xff1a; 工作原理 HTTP 服务器监听指定端口&#xff08;通常是 80 端口用于 HTTP&#xff0c;443 端口用于 HT…

Moldflow模流分析教程

Moldflow模流分析教程&#xff1a;

计算机网络 3-4 数据链路层(局域网)

4.1 局域网LAN 特点 1.覆盖较小的地理范围 2.较低的时延和误码率 3.局域网内的各节点之间 4.支持单播、广播、多播 分类 关注三要素 &#xff08;出题点&#xff09; ①拓扑结构 ②传输介质 ③介质访问控制方式 硬件架构 4.2 以太网 4.2.1 层次划分 4.2.2 物理层标准…

单片机AIN0、AIN1引脚功能

目录 1. 模拟-数字转换器&#xff08;ADC&#xff09; 2. 交流电源&#xff08;AC&#xff09; 总结 这两部分有什么区别&#xff1f; 在这个电路图中&#xff0c;两个部分分别是模拟-数字转换器&#xff08;ADC&#xff09;和交流电源&#xff08;AC&#xff09;。以下是这…

如何增加 Elasticsearch 中的 primary shard 数量

作者&#xff1a;来自 Elastic Kofi Bartlett 探索增加 Elasticsearch 中 primary shard 数量的方法。 更多阅读&#xff1a; Elasticsearch&#xff1a;Split index API - 把一个大的索引分拆成更多分片 Elasticsearch&#xff1a;通过 shrink API 减少 shard 数量来缩小 El…

Java 并发性能优化:线程池的最佳实践

Java 并发性能优化&#xff1a;线程池的最佳实践 在 Java 并发编程的世界里&#xff0c;线程池堪称提高应用性能与稳定性的神器。恰如其分地运用线程池&#xff0c;能让我们在多线程任务调度时游刃有余&#xff0c;既能避免线程频繁创建销毁带来的开销&#xff0c;又能合理管控…

【综述】一文读懂卷积神经网络(CNN)

卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;&#xff0c;是深度学习&#xff08;deep learning&#xff09;的代表算法之一。本文旨在介绍CN…

阿里云集群开启debug

1、安装 kubectl Macos brew install kubectl Windows&#xff1a; https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下载后&#xff0c;放到任意目录 2、配置连接信息 mac 将以下内容复制到计算机 $HOME/.kube/config 文件下: windows 不同集…