问题描述
我想做一个笔记应用。然而,对我来说最难弄清楚的部分是如何为其添加富文本支持。
例如,我希望用户能够选择一些文本,按下粗体按钮,它应该将所选文本切换为粗体(如果是普通文本则使其加粗,如果是粗体则使其正常,就像在 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