9

有人可以清楚地解释 Android 的 Spanned Java 接口中的标志吗? 文档不清楚,我需要更多详细信息,就像在这个 SO answer中解释其他标志一样。

请求以下标志的定义:

SPAN_COMPOSING
SPAN_INTERMEDIATE
SPAN_POINT_MARK_MASK
SPAN_PRIORITY
SPAN_USER
SPAN_USER_SHIFT
4

1 回答 1

12

SPAN_COMPOSING是用于输入文本的标志,被认为是一个临时跨度,旨在在输入完成后被删除,“此标志设置在用于将临时样式信息应用于输入法的组成文本的跨度上,以便在替换撰写文本时可以找到并删除它们。”

这是一个使用 SPAN_COMPOSING 并将其从文本中删除的代码示例;相关代码引用如下:

public static final void removeComposingSpans(Spannable text) {

    text.removeSpan(COMPOSING);
    Object[] sps = text.getSpans(0, text.length(), Object.class);

    if (sps != null) {

        for (int i = sps.length-1; i >= 0; i--) {

            Object o = sps[i];

            if ((text.getSpanFlags(o) & Spanned.SPAN_COMPOSING) != 0) {

                text.removeSpan(o);
            }
        }
    }
}

public static void setComposingSpans(Spannable text) {

    final Object[] sps = text.getSpans(0, text.length(), Object.class);

    if (sps != null) {

        for (int i = sps.length - 1; i >= 0; i--) {

            final Object o = sps[i];

            if (o == COMPOSING) {

                text.removeSpan(o);
                continue;
            }

            final int fl = text.getSpanFlags(o);

            if ((fl & (Spanned.SPAN_COMPOSING | Spanned.SPAN_POINT_MARK_MASK)) 
                    != (Spanned.SPAN_COMPOSING | Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)) {

                text.setSpan(o, text.getSpanStart(o), text.getSpanEnd(o),
                        (fl & Spanned.SPAN_POINT_MARK_MASK)
                                | Spanned.SPAN_COMPOSING
                                | Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }

    text.setSpan(COMPOSING, 0, text.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING);
}

SPAN_INTERMEDIATE将被视为一个标志,用于在进行更改时临时分配给跨度,并在应用更改后将其删除。“此标志将为中间跨度更改设置,这意味着它之后肯定会有另一个更改。”

SPAN_POINT_MARK_MASK是一个位掩码,主要用于比较目的,以检查是否应用了合格的位状态。请参阅上面引用的代码中的正确用法。

SPAN_PRIORITY是指用于更新目的的文本布局的优先级;API 指出,它只应在特殊情况下设置,因此开发人员无需设置。

SPAN_USERSPAN_USER_SHIFT是额外的自定义标量数据的存储区域,如果开发人员选择使用它们,它们将与跨度一起存储。

于 2013-05-14T15:13:50.220 回答