【问题标题】:Explain the definitions of these flags (SPAN_COMPOSING, SPAN_USER, etc.) from the Spanned interface从 Spanned 接口解释这些标志(SPAN_COMPOSING、SPAN_USER 等)的定义
【发布时间】:2013-05-06 05:25:09
【问题描述】:

有人可以对 Android 的 Spanned Java 界面中的标志提供一个清晰的解释吗? The documentation 不清楚,我需要更多详细信息,就像在 this SO answer 中解释其他标志一样。

请求以下标志的定义:

SPAN_COMPOSING
SPAN_INTERMEDIATE
SPAN_POINT_MARK_MASK
SPAN_PRIORITY
SPAN_USER
SPAN_USER_SHIFT

【问题讨论】:

    标签: android html


    【解决方案1】:

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

    Here is an example of code 使用 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 是用于存储额外自定义标量数据的存储区域,如果开发人员选择使用它们,它们将与 span 一起存储。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多