在 Android 应用程序中实现富文本支持的最佳方式是什么?

问题描述

我想做一个笔记应用。然而,对我来说最难弄清楚的部分是如何为其添加富文本支持

例如,我希望用户能够选择一些文本,按下粗体按钮,它应该将所选文本切换为粗体(如果是普通文本则使其加粗,如果是粗体则使其正常,就像在 Word 或 Google 文档中一样)。

我的想法是支持尽可能多的格式。我想到的是:

  • 粗体
  • 斜体
  • 下划线
  • 删除线
  • 左对齐
  • 居中对齐
  • 右对齐
  • 合理对齐
  • 突出显示(背景颜色)
  • 文字颜色
  • 项目符号列表

我考虑过使用 SpannableStrings,现在,它与以下代码配合得很好:

editText.text.setSpan(StyleSpan(Typeface.BOLD),editText.selectionStart,editText.selectionEnd,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

但问题是切换选择时不会弄乱其他样式(例如切换粗体样式时,不影响斜体等),至于现在,上面的代码只会使它们变粗,但不会恢复正常。

此外,如果将其转换为字符串(如果可能的话)或在 Gson 库的帮助下直接存储对象,我不知道如何保存它们。

我想到的另一种选择是使用 Html 标签,因为将整个内容保存为字符串很容易,但缺点是应用效果本身,因为我会将 html 标签添加到文本中,这可能会导致问题。

我正在使用 Kotlin 和 Room。你会推荐我做什么?

解决方法

好吧,您肯定需要在这背后有一些逻辑。可能如果我是你,我会创建一个包含你想要使用的所有功能的枚举(例如 BOLD、ITALIC、UNDERLINE ...),每次用户选择部分文本时,我会存储包含 start 元组的列表/end 文本索引,用于定义文本选择及其样式。不幸的是,每次您想要设置新样式时,您都需要重新加载可跨越字符串并再次在 TextView 上设置它。示例如下所示:

data class StyleSelection(
    val selection: Pair<Int,Int>,val style: Style
)
...
styleSelections.add(StyleSelection(pairOf(x,y),Style.BOLD))
...
create SpannableString from the StyleSelection objects

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...