Android-Rich-text-Editor

Android-Rich-text-Editor

Android富文本编辑器 支持多样式和HTML互转

Android-Rich-text-Editor是一款开源的Android富文本编辑器,支持多种文本样式、列表、对齐及媒体插入等功能。具备HTML导入导出能力,可实现富文本编辑和展示。项目持续更新,为Android开发提供了处理富文本的有力工具。

Android富文本编辑器开源项目文本样式SpanGithub

下载 GitHub 许可证

Android富文本编辑器

如果你正在寻找一个优秀的Android富文本编辑器,千万不要错过这个!

另外,我目前正在寻找工作机会。如果你有合适的职位空缺,欢迎通过chinalwb168@gmail.com与我联系。谢谢!

该项目目前仍在开发中,欢迎fork并加入我!

我已将颜色选择器表情选择器发布为独立组件,以便在其他项目中轻松重用。

各位好!如果你正在阅读这段文字,我相信你正在为Android上的富文本编辑器寻找解决方案,特别是希望使用Android原生API来实现。如果我猜对了,也许我可以帮上忙。但是从这个项目开始,我就开源了所有代码,并免费帮助了数十甚至上百位朋友解决了他们的问题。现在我不得不对未来的帮助收费,每个功能实现从49美元起;每个功能咨询19美元起。所有改进都将开源以帮助其他人。详情请联系329055754@qq.com。谢谢!

这是用Java实现的

图片

支持的样式:

  • 粗体
  • 斜体
  • 下划线
  • 删除线
  • 数字列表
  • 项目符号列表
  • 左对齐
  • 居中对齐
  • 右对齐
  • 插入图片
  • 背景颜色
  • 超链接
  • @
  • 引用
  • 前景色
  • 表情图标
  • 上标
  • 下标
  • 字体大小
  • 视频
  • 网络图片
  • 分隔线
  • 所有样式支持保存为HTML文件
  • 从HTML加载后继续编辑或显示 - 0.1.0版本新功能

0.2.0版本发布:迁移到AndroidX

  • 更新Glide至4.11.0
  • 最后一个非AndroidX版本是0.1.10

0.1.8版本发布:增加了在一个页面中支持多个ARE实例的功能

0.1.7版本发布:更新Glide至4.9.0

0.1.6版本

  • 维护性发布,包括:
  • 在ARE_Toolbar_Default中添加了前景色样式
  • 在ARE_Toolbar_Default中添加了背景色样式
  • 修复bug

图片

下一版本计划:
  • 撤销
  • 重做

如果你有任何想在下一版本中添加的功能,请告诉我,谢谢。

ARE工作原理

  • 两种使用模式

    1. AREditor。编辑框(输入区域)和工具栏(样式工具)在同一个组件中。即:如果你在布局XML中包含<com.chinalwb.are.AREditor .../>,你将在活动中看到输入区域和样式工具(粗体/斜体/对齐/项目符号列表等)。

    2. AREditText + IARE_Toolbar(这是一个接口)。编辑框(输入区域)和工具栏(样式工具)是独立的组件。即:你可以选择是否显示工具栏,以及将其放置在AREditText的下方或底部、左侧或右侧,或任何其他对齐方式,因为工具栏本身是一个HorizontalScrollView(默认实现是ARE_ToolbarDefault),同时你还可以决定向工具栏添加哪些工具项。

  • 这两种模式的内部结构:

    1. AREditor:它扩展自RelativeLayout,包含两个子组件:AREditTextARE_Toolbar

      1. AREditText扩展自AppCompatEditText,在其TextWatcherafterTextChanged方法中,它调用IARE_StyleapplyStyle

      2. ARE_Toolbar扩展自LinearLayout,内部的工具项是IARE_Style实例,每个实例包含一个在工具栏中显示的ImageView

    2. AREditText + IARE_Toolbar。

      1. 关于AREditText无需重复

      2. IARE_Toolbar是一个接口,定义了工具栏需要实现的功能。如:addToolbarItemgetToolItems等。在are中,有一个默认实现:ARE_ToolbarDefault,它扩展自HorizontalScrollView,并实现了IARE_Toolbar接口中的所有方法。

      3. ARE_ToolbarDefault只是一个工具栏,即:工具项容器,真正执行工作的组件是IARE_ToolItem,这是另一个定义工具项行为的接口,如:getView返回在工具栏中显示的视图,getStyle返回一个IARE_Style来响应文本变化。目前有19个工具项实现:

        1. ARE_ToolItem_Abstract ARE_ToolItem_AlignmentCenter ARE_ToolItem_AlignmentLeft ARE_ToolItem_AlignmentRight ARE_ToolItem_At ARE_ToolItem_Bold ARE_ToolItem_Hr ARE_ToolItem_Image ARE_ToolItem_Italic ARE_ToolItem_Link ARE_ToolItem_ListBullet ARE_ToolItem_ListNumber ARE_ToolItem_Quote ARE_ToolItem_Strikethrough ARE_ToolItem_Subscript ARE_ToolItem_Superscript ARE_ToolItem_Underline ARE_ToolItem_UpdaterDefault ARE_ToolItem_Video

        2. 上述工具项可以通过调用addToolbarItem(IARE_ToolItem toolItem)添加到工具栏

  1. 如果你想添加自己的工具项,只需要实现你的IARE_ToolItem接口即可。例如,如果你想添加一个更改字体的工具项,那么你可以定义ARE_ToolItem_FontFamily并实现IARE_ToolItem中的方法。你可以参考上述任何一个工具项作为参考。

  2. 特别是如果你想添加一个新功能,比如@或者##,可以查看ARE_ToolItem_At.java,这是一个没有工具栏图标的工具项示例。

集成

在你的app模块的gradle.build文件中,在dependencies中添加以下内容:

implementation 'com.github.bumptech.glide:glide:4.9.0' implementation 'com.github.chinalwb:are:0.1.7'

或者,由于are还不够稳定,无法处理不同业务场景中的各种问题,我建议直接将are导入到你的项目中,并将其作为本地模块依赖。

	implementation project(':are')

自定义和示例

布局XML中AREditor的文档

名称格式描述
expandMode枚举FULL(默认:全屏编辑器)/ MIN(最小高度编辑器,maxLines = 3)
hideToolbar布尔值是否隐藏工具栏,默认显示工具栏。当你使用MIN展开模式时,可能需要将其设置为true,@功能仍然可用,但其他功能将无法使用,因为工具栏上的那些样式已被隐藏。
toolbarAlignment枚举BOTTOM(默认:在AREditor底部)/ TOP(在AREditor顶部)

Java中AREditor的API

方法参数描述
AREditorsetExpandModeAREditor.ExpandMode设置编辑区域模式。可能的值有:ExpandMode.FULL(默认)/ ExpandMode.MIN
AREditorsetHideToolbarboolean设置为true隐藏工具栏;设置为false显示工具栏
AREditorsetToolbarAlignmentAREditor.ToolbarAlignment设置工具栏位置。可能的值有:ToolbarAlignment.BOTTOM(默认)/ ToolbarAlignment.TOP

AREditor示例

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:are="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_dark" > <TextView android:id="@+id/xView" android:layout_above="@+id/areditor" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="1dp" android:background="@color/colorAccent" android:gravity="center" android:textSize="50sp" android:text="你的ListView可能在这里" /> <com.chinalwb.are.AREditor android:id="@+id/areditor" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@android:color/holo_green_dark" are:expandMode="MIN" are:hideToolbar="true" are:toolbarAlignment="TOP" /> </RelativeLayout>

Java:

AREditor arEditor = this.findViewById(R.id.areditor);
arEditor.setExpandMode(AREditor.ExpandMode.FULL);
arEditor.setHideToolbar(false);
arEditor.setToolbarAlignment(AREditor.ToolbarAlignment.BOTTOM);

==========

AREditText本身是AppCompatEditText的子类,所以适用于AppCompatEditText的任何东西也适用于AREditText

==========

ARE_ToolbarDefault文档

它继承自HorizontalScrollView,所以适用于HorizontalScrollView的任何东西也适用于ARE_ToolbarDefault

IARE_Toolbar的API

方法参数描述
IARE_ToolbaraddToolbarItemIARE_ToolItem向工具栏添加工具项
IARE_ToolbargetToolItems-无-返回工具栏中的所有工具项
IARE_ToolbarsetEditTextAREditText将AREditText与工具栏绑定
IARE_ToolbargetEditText-无-返回绑定的AREditText
IARE_ToolbaronActivityResultrequestCode(int) resultCode(int) data(Intent)对于一些样式,如插入图片、视频或@功能,你需要打开一个新的Activity,并需要通过onActivityResult处理数据,在这个方法中你可以分发到特定的样式。

IARE_ToolItem的API

方法参数描述
IARE_ToolItemgetStyle-无-每个工具项都是一个样式,一个样式与特定的span结合。
IARE_ToolItemgetViewContext每个工具项都有一个视图。如果context为null,返回生成的视图。
IARE_ToolItemonSelectionChangedint selStart, int selEnd选择改变回调。更新工具项选中状态
IARE_ToolItemgetToolbar-无-返回此工具项的工具栏。
IARE_ToolItemsetToolbarIARE_Toolbar为此工具项设置工具栏。
IARE_ToolItemgetToolItemUpdater-无-获取工具项更新器实例,在样式被选中和取消选中时会被调用。
IARE_ToolItemsetToolItemUpdaterIARE_ToolItem_Updater设置工具项更新器。
IARE_ToolItemonActivityResultrequestCode(int) resultCode(int) data(Intent)处理从IARE_Toolbar分发的事件

示例:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:are="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_dark"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottombar" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:background="@android:color/white"> <com.chinalwb.are.AREditText android:id="@+id/arEditText" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="top|left" android:hint="在此输入文本" android:textSize="50sp" /> </ScrollView> <LinearLayout android:id="@+id/bottombar" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:orientation="horizontal" android:weightSum="1000"> <com.chinalwb.are.styles.toolbar.ARE_ToolbarDefault android:id="@+id/areToolbar" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="900" android:background="@color/colorPrimary" android:gravity="center_vertical" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="5" android:background="@color/colorPrimaryDark" /> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="95" android:background="@color/colorAccent" android:gravity="center"> <ImageView android:id="@+id/arrow" android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/arrow_right" /> </LinearLayout> </LinearLayout> </RelativeLayout>

Java示例代码:设置自定义工具栏

public class ARE_DefaultToolbarActivity extends AppCompatActivity { private IARE_Toolbar mToolbar; private AREditText mEditText; private boolean scrollerAtEnd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_are__default_toolbar); initToolbar(); } private void initToolbar() { mToolbar = this.findViewById(R.id.areToolbar); IARE_ToolItem bold = new ARE_ToolItem_Bold(); IARE_ToolItem italic = new ARE_ToolItem_Italic(); IARE_ToolItem underline = new ARE_ToolItem_Underline(); IARE_ToolItem strikethrough = new ARE_ToolItem_Strikethrough(); IARE_ToolItem quote = new ARE_ToolItem_Quote(); IARE_ToolItem listNumber = new ARE_ToolItem_ListNumber(); IARE_ToolItem listBullet = new ARE_ToolItem_ListBullet(); IARE_ToolItem hr = new ARE_ToolItem_Hr(); IARE_ToolItem link = new ARE_ToolItem_Link(); IARE_ToolItem subscript = new ARE_ToolItem_Subscript(); IARE_ToolItem superscript = new ARE_ToolItem_Superscript(); IARE_ToolItem left = new ARE_ToolItem_AlignmentLeft(); IARE_ToolItem center = new ARE_ToolItem_AlignmentCenter(); IARE_ToolItem right = new ARE_ToolItem_AlignmentRight(); IARE_ToolItem image = new ARE_ToolItem_Image(); IARE_ToolItem video = new ARE_ToolItem_Video(); IARE_ToolItem at = new ARE_ToolItem_At(); mToolbar.addToolbarItem(bold); mToolbar.addToolbarItem(italic); mToolbar.addToolbarItem(underline); mToolbar.addToolbarItem(strikethrough); mToolbar.addToolbarItem(quote); mToolbar.addToolbarItem(listNumber); mToolbar.addToolbarItem(listBullet); mToolbar.addToolbarItem(hr); mToolbar.addToolbarItem(link); mToolbar.addToolbarItem(subscript); mToolbar.addToolbarItem(superscript); mToolbar.addToolbarItem(left); mToolbar.addToolbarItem(center); mToolbar.addToolbarItem(right); mToolbar.addToolbarItem(image); mToolbar.addToolbarItem(video); mToolbar.addToolbarItem(at); mEditText = this.findViewById(R.id.arEditText); mEditText.setToolbar(mToolbar); setHtml(); initToolbarArrow(); } private void setHtml() { String html = "<p style=\"text-align: center;\"><strong>0.1.2版本新特性</strong></p>\n" + "<p style=\"text-align: center;\">&nbsp;</p>\n" + "<p style=\"text-align: left;\"><span style=\"color: #3366ff;\">在此版本中,您可以使用ARE的新用法。</span></p>\n" + "<p style=\"text-align: left;\">&nbsp;</p>\n" + "<p style=\"text-align: left;\"><span style=\"color: #3366ff;\">AREditText + ARE_Toolbar,现在您可以控制输入区域的位置、工具栏的放置位置以及工具栏中要包含的工具项。</span></p>\n" + "<p style=\"text-align: left;\">&nbsp;</p>\n" + "<p style=\"text-align: left;\"><span style=\"color: #3366ff;\">您不仅可以定义工具栏(及其样式),还可以将自定义的ARE_ToolItem及其样式添加到ARE中。</span></p>\n" + "<p style=\"text-align: left;\">&nbsp;</p>\n" + "<p style=\"text-align: left;\"><span style=\"color: #ff00ff;\"><em><strong>何不现在就试试看?</strong></em></span></p>"; mEditText.fromHtml(html); } private void initToolbarArrow() { final ImageView imageView = this.findViewById(R.id.arrow); if (this.mToolbar instanceof ARE_ToolbarDefault) { ((ARE_ToolbarDefault) mToolbar).getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { int scrollX = ((ARE_ToolbarDefault) mToolbar).getScrollX(); int scrollWidth = ((ARE_ToolbarDefault) mToolbar).getWidth(); int fullWidth = ((ARE_ToolbarDefault) mToolbar).getChildAt(0).getWidth(); 如果 (滚动X + 滚动宽度 < 总宽度) { 图片视图.设置图片资源(R.drawable.右箭头); 滚动到末端 = false; } else { 图片视图.设置图片资源(R.drawable.左箭头); 滚动到末端 = true; } } }); } 图片视图.设置点击监听器(new 视图.点击监听器() { @Override public void 点击(视图 view) { if (滚动到末端) { ((ARE_默认工具栏) 工具栏).平滑滚动(-整数.最大值, 0); 滚动到末端 = false; } else { int 水平滚动宽度 = ((ARE_默认工具栏) 工具栏).getChildAt(0).getWidth(); ((ARE_默认工具栏) 工具栏).平滑滚动(水平滚动宽度, 0); 滚动到末端 = true; } } }); } @Override public boolean 创建选项菜单(菜单 menu) { 获取菜单填充器().填充(R.menu.main, menu); return true; } @Override public boolean 选项菜单项被选中(菜单项 item) { int 菜单ID = item.getItemId(); if (菜单ID == com.chinalwb.are.R.id.action_save) { String html = this.编辑文本.获取Html(); 演示工具.保存Html(this, html); return true; } if (菜单ID == R.id.action_show_tv) { String html = this.编辑文本.获取Html(); Intent intent = new Intent(this, 文本视图活动.class); intent.putExtra(HTML_文本, html); 启动活动(intent); return true; } return super.选项菜单项被选中(item); } @Override protected void 活动结果(int 请求码, int 结果码, Intent 数据) { 工具栏.活动结果(请求码, 结果码, 数据); } }

AREditor 的 API

方法参数描述
AREditor从Html字符串将html加载到AREditor
AREditor获取Html返回AREditor中当前内容的HTML源码
AREditor获取ARE返回此AREditor中的AREditText实例

AREditText 的 API

方法参数描述
AREditText从Html将html加载到AREditor
AREditText获取Html返回AREditor中当前内容的HTML源码
AREditText设置工具栏IARE_工具栏设置IARE_工具栏实例(仅在作为分离组件工作并与自定义工具栏一起工作时需要)

更多示例可以在这里找到。

可用功能演示:

[图片]

[动图]

进行中的项目:

  • 音频
  • 字体系列
  • 右缩进
  • 左缩进
  • 将编辑保存到本地SQLite
  • 笔记列表
  • 标题 - 延期,可以通过字体大小和居中样式完成

你可以在这里下载APK:

点击 ARE_20190524_0.1.6.apk 下载

已知问题:

  • 背景颜色 - 将光标放在BackgroundColorSpan范围内时不可见

感谢 @Yasujizr 为ARE提供了logo。@Yasujizr 我希望现在能得到一个新logo :) 你能帮我吗?


如果你发现我的工作对你有帮助或者你开始使用我的代码,你不需要给我买咖啡,只是你能给我发一个"✨"吗?你的*鼓励我开源更多功能,谢谢你的支持。 如果你需要任何定制或有任何建议,可以联系我,邮箱是329055754@qq.com

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多