android - SPAN_POINT_MARK 和 SPAN_MARK_POINT 有什么区别?

标签 android spannable spanned

我一直在阅读 Spanned/Spannable 的文档我正在从事的项目的类(class)。我一直对包含 MARKPOINT 的 span 的定义和用法感到困惑。

MARK 似乎在 Doc 中被定义为“附加”到角色的位置,而 POINT 被定义为“粘附”到角色。因此,当文本更改时,MARK 不会移动,而当文本更改时,POINT 将随着它“粘附”到的字符移动。

这些定义似乎表明 MARKINCLUSIVE 同义,而 POINTEXCLUSIVE 同义。

但是,情况并非如此,因为 SPAN_MARK_MARKSPAN_POINT_POINT 都不是 SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE 的同义词.事实上,SPAN_INCLUSIVE_INCLUSIVESPAN_MARK_POINT 相同,SPAN_POINT_MARKSPAN_EXCLUSIVE_EXCLUSIVE 相同。

我的问题如下

  1. 为什么 SPAN_POINT_MARKSPAN_EXCLUSIVE_EXCLUSIVE 同义?为什么 SPAN_MARK_POINTSPAN_INCLUSIVE_INCLUSIVE 同义?

  2. 为什么 SPAN_MARK_MARKSPAN_POINT_POINT 不分别与 SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE 同义?

  3. MARKPOINT 在这个用法中的真正定义是什么?

最佳答案

我想解释 MARK 与 POINT 的方式是将它们表示为方括号,无论它们在文本范围内存在什么偏移量。括号指向的方向表示标记或点“附加”到的字符。

因此对于 POINT,您可以使用左括号 - 它附加到它后面的字符。对于 MARK,您可以使用右括号 - 它附加到它前面的字符。

让我们看一下每种类型的一些示例:

SPAN_MARK_MARK

在 0 长度 Spanned 的偏移处插入:标记保持固定。

Before: Lorem ]]ipsum dolor sit.
After:  Lorem ]]INSERTipsum dolor sit.

Inserting at the start of a non-0-length span:插入的文本包含在 Spanned 范围内。

Before: Lorem ]ipsum] dolor sit.
After:  Lorem ]INSERTipsum] dolor sit.

在非 0 长度 Spanned 的末尾插入:插入的文本被排除在 Spanned 范围之外。

Before: Lorem ]ipsum] dolor sit.
After:  Lorem ]ipsum]INSERT dolor sit.

您可以从最后两个示例中看出,为什么 SPAN_MARK_MARK 标志与 SPAN_INCLUSIVE_EXCLUSIVE 标志同义。在 Spanned 开头插入的文本包含在范围内,而在末尾插入的文本被排除在外。

SPAN_POINT_POINT

在 0 长度 Spanned 的偏移处插入:点被向前推。

Before: Lorem [[ipsum dolor sit.
After:  Lorem INSERT[[ipsum dolor sit.

Inserting at the start of a non-0-length span:插入的文本被排除在 Spanned 范围之外。

Before: Lorem [ipsum[ dolor sit.
After:  Lorem INSERT[ipsum[ dolor sit.

Inserting at the end of a non-0-length span:插入的文本包含在 Spanned 范围内。

Before: Lorem [ipsum[ dolor sit.
After:  Lorem [ipsumINSERT[ dolor sit.

您可以从最后两个示例中再次看出为什么 SPAN_POINT_POINT 标志与 SPAN_EXCLUSIVE_INCLUSIVE 标志同义。在范围开头插入的文本被排除在范围之外,而在末尾插入的文本被包括在内。

SPAN_MARK_POINT

Inserting at the start of the span:插入的文本包含在范围内。

Before: Lorem ]ipsum[ dolor sit.
After:  Lorem ]INSERTipsum[ dolor sit.

在范围末尾插入:插入的文本仍包含在范围内。

Before: Lorem ]ipsum[ dolor sit.
After:  Lorem ]ipsumINSERT[ dolor sit.

因此它具有同义词 SPAN_INCLUSIVE_INCLUSIVE - 插入的文本始终包含在 Spanned 范围内。

SPAN_POINT_MARK

Inserting at the start of the span:插入的文本被排除在范围之外。

Before: Lorem [ipsum] dolor sit.
After:  Lorem INSERT[ipsum] dolor sit.

在范围的末尾插入:插入的文本仍然不在范围内。

Before: Lorem [ipsum] dolor sit.
After:  Lorem [ipsum]INSERT dolor sit.

因此它具有同义词 SPAN_EXCLUSIVE_EXCLUSIVE - 插入的文本始终被排除在 Spanned 范围之外。

我认为文档通过拆分一些同义词的定义来混淆事物。例如,在描述 SPAN_MARK_MARK 时,他们仅根据 0 长度 Spanned 定义其用法。然后在定义 SPAN_INCLUSIVE_EXCLUSIVE(这是一个同义词)时,他们只根据非 0 长度范围定义其用法。我认为,如果他们预先声明它们是同义词,并且两个术语共享一个定义,那就更清楚了。

关于android - SPAN_POINT_MARK 和 SPAN_MARK_POINT 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531555/

相关文章:

Android 编辑文本 : how to apply spans when composing?

android - spannableStringBuilder 无法在单个 TextView 中使用多个跨度

android:如何持久存储 Spanned ?

Android Edittext 可跨越问题

android - 高效使用 Android 资源

java - 如何从回收者 View 适配器获取项目

java - 在 Canvas 上绘制可跨越的编辑文本内容

java - 新人 : Android Studio: Error:Execution failed for task ':app:processDebugManifest'

android - Android 多帐户的 clearPackagePreferredActivities 异常

android - TextView 为 <li> 标签呈现丑陋的项目符号