您当前的位置:首页 > 互联网教程

Android 上有什么好用的 markdown 编辑器

发布时间:2025-05-11 18:31:26    发布人:远客网络

Android 上有什么好用的 markdown 编辑器

一、Android 上有什么好用的 markdown 编辑器

Android上有好用的markdown编辑器:Ulysses、Yu Writer、Typora、iA Writer、MarkdownX。

支持文章管理、支持图片、可以自定义主题和样式,甚至可以写一本书,功能很强大,可是貌似没有win版,需要一台mac笔记本才行。

2、Yu Writer \国产跨平台的MD文本编辑器新秀

小编最近就在体验这款产品,可以随意更换主题和布局,各种一键插入图片、一键建表格、插代码、链接、公式,一键切换布局使得等操作起来十分高效流畅自然,对新手非常友好。

导出成docx(Oce Word文档),PDF、HTML网页、TXT以及图片格式。而且作为国产软件,HTML网页除了支持导出WordPress兼容格式外,还能支持微信公众号的格式。对微信排版个性化程度不高,可以排版后放到秀米等美化一下。

3、Typora \免费极简Markdown编辑器

Typora抛弃了传统的交互模式,它只使用一个窗口,却能优雅地实现同时将代码编辑与预览结合起来!从而为用户带来更加流畅直观的,所见即所得的Markdown写作体验。

4、iA Writer \跨平台轻量级写作工具

iA Writer是一款以设计简单优雅著称的跨平台轻量级纯文本编辑器,这款的写作应用支持iOS、Android和Mac \平台,无论是随时随地移动办公、写博客、写日记、写草稿,它都能让你在这些设备上更加便利高效率地写作……

5、MarkdownX \最优秀的Android安卓Markdown编辑器

Android安卓平台上优秀的Markdown编辑器却很少,所以今天这款免费的MarkdownX真的值得推荐……它能满足我们随时记笔记和写作的需求。

二、Android开发常用工具(二)

腾讯出品,用于软件研发流程控制:产品提需求->根据需求分配任务->完成任务提测试->测试完成->发布版本,一整套工作流程都可以在上面实现。记得15年时,我们的工作模式流程是全部分开的,产品写需求在word文档存在svn,开发想看要先在svn下载,测试提测是通过在禅道上提测。

比QQ好用,专注于办公模式,没有杂七杂八的功能。

用来连接远程登录 linux服务器,部署项目,jenkin等等。

FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。android开发中用于上传apk包到服务器或者从服务器下载apk包。

是一款将手机屏投射到电脑屏,用电脑实时控制手机的软件。可以不用低头看手机啦,但有个缺点,连接手机后点击编辑框软键盘不会被弹窗,可能是没设置好,也很少用这个软件。

Github上的开源项目:,Android投屏神器,相比Total Control,质量高清,低延迟,启动快,非侵入性。

谷歌浏览器,非常简洁,适用于开发办公,很喜欢书签的保存功能,用来保存Jenkins打包、测试服操作日志、测试服后台管理系统、免费看球的链接等等。

远程控制电脑软件,疫情期间用于在家办公想控制公司电脑,相比其它远程控制软件,延迟低,连接快。

全局代理软件、配合shadowsocks等可实现全局软件科学上网。

像记事本一样,小巧、免费的纯文本编辑器,内置支持多达 27种语法高亮度显示(囊括各种常见的源代码、脚本),可以方便用来编辑shell脚本、查看代码等等。

三、如何实现一个 Android 端的富文本编辑器

在 Android上实现富文本编辑器的思路大致分为三种:

使用多种 Layout布局,每一种布局对应一种 HTML格式,比如图片,比如顺序列表等。具体的实现例子可以参考这个链接。 Medium和

Evernote的富文本编辑就是采用这种方式实现的。总体来说比较复杂。

WebView+ JavaScript实现。现在 Web端有很多成熟的 JavaScript富文本编辑库,比如 Squire,你只需要做好

WebView和 JavaScript的交互就可以了(多写回调函数)。理论上虽然是这么说,但是在实现过程你需要解决 WebView的兼容性问题(

Android 4.4及其以上版本和 4.4以下版本的 WebView内核不一样),以及其他一些不可预见的问题(比如就遇到无法粘贴文字的问题)。

EditText+ Span。 Android的 TextView原生支持诸如粗体、删除线、引用等 Span

,要实现简单的富文本编辑需求,可操作性还是比较大的。综合再三,选择了这种方式来实现自己的需求。

既然决定使用 EditText+ Span的方式来实现,必然要对相关的 API有所了解。

首先来了解一下 Span。Span是一个强大的概念,有兴趣深入的同学推荐直接阅读这篇译文。

在这里主要使用两种类型的 Span:

继承自 CharacterStyle的 Span,比如 StyleSpan,可以在字符级别上添加粗体,下划线等。

继承自 ParagraphStyle的 Span,比如 QuoteSpan,可以为段落级别的文本添加引用。

接着需要一个可以将 Span的效果设置进去的文本结构(即实现了 Spannable接口), SpannableStringBuilder

是个不错的选择,同时 EditText提供的 getEditableText()方法也可以获得。通常只需要 getEditableText()

就可以了,但是在面对一些细节部分,可以使用 SpannableStringBuilder预先设置相应的 Span,再替换到原来的文本中。

设置 Span的方式也很简单,需要调用 Spannable.setSpan(Object what, int start, int end, int

flags)这个方法即可,方法中 4个参数的解释如下:

Object what,传入你使用的 Span对象。

int start,设置 Span的开始位置。

int end,设置 Span的结束位置。

int flags,代表设置 Span的作用域。

在这里重点介绍一下 int flags这个参数,它接受 4种类型的参数,分别是:

Spanned.SPAN_INCLUSIVE_EXCLUSIVE,表示你在设置 Span的区域之前输入文字,输入的文字也会受到 Span

Spanned.SPAN_INCLUSIVE_INCLUSIVE,表示你在设置 Span的区域前后输入文字,输入的文字都后受到 Span

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,表示你在设置 Span的区域中出输入文字,输入的文字才会受到 Span

Spanned.SPAN_EXCLUSIVE_INCLUSIVE,表示你在设置 Span的区域之后输入文字,输入的文字也会受到 Span

「受到影响」的意思就是,仍然会保持你设置的 Span的样式,比如选择Spanned.SPAN_EXCLUSIVE_INCLUSIVE

设置了一段文字的粗体,那么在这段文字后新输入的文字,也会是粗体。在这里推荐使用Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

参数,毕竟其他几种参数相对不是很好控制,而且会给使用的人带来的疑惑。认为一个操作代表的行为应当是准确没有歧义的。

好,到这里已经知道大致怎么作出一个富文本编辑器组件的样子了,无非是指定开始位置和结束位置,再设置相应的 Span

即可。至于设置的时候采取什么样的规则,你可以自己定制。但仅仅解决了编辑的问题,仍然存在导入的问题和导出的问题。

导入的问题十分简单, Android SDK中提供了 Html.fromHtml()这个方法,可以很轻松地将 HTML字符串转换为所需的

Spanned对象。但是需要注意的是, Html.fromHtml()并不支持所有的 HTML标签,比如无序列表就不支持,因此你需要自己实现

Html.TagHandler接口来处理自己所需的标签,可以参考这个链接,实现了删除线和简单无序列表的支持。

面对粗体、斜体这样字符级别的样式, Html.fromHtml()

会自然而然的解析,该添加换行的地方就添加换行,并没有什么问题;但是面对引用、无序列表这样段落级别的样式,该方法会追加一个换行,也就是两个换行操作,相当于多出一个空行。通常来说认为一个

,但是如果你有特别需求的话,也可以通过前面说的那样,自己来解析,而不是用系统默认的方式。

之前介绍了如何导入,想必你也十分清楚,必然有一个对应的Html.toHtml()方法!没错,但是遗憾的是,这个方法也不全支持所有 Span

,比如列表就不支持。不过没有关系, Html.toHtml()这个方法本身的源码简洁易懂,可以参考着实现。

在这里重点说明 Spannanle的一个接口方法 nextSpanTransition(int start, int limit, Class

type),这个方法会在你指定的文本范围内,返回下一个你指定的 Span类型的开始位置,依照这个方法,就可以逐层扫描指定的 Span

,而不用同时考虑其他类型的 Span的影响,十分有用。

最后尽管说了这么多,导入导出还是有一个比较关键的问题,即导入的内容和导出的内容要保持一致,在这点上目前我还比较难以实现,只能说尽量控制吧,必要的时候还需要使用一下正则来处理导入导出的文本。