Объясните определения этих флагов (SPAN_COMPOSING, SPAN_USER и т.д.) Из Spanned interface

Может ли кто-нибудь дать четкое объяснение флагов, найденных в Spanned Java-интерфейсе для Android? Документация не ясна, и мне требуется более подробная информация, так же, как и другие флаги были объяснены в this SO ответьте.

Запрос определений для следующих флагов:

SPAN_COMPOSING
SPAN_INTERMEDIATE
SPAN_POINT_MARK_MASK
SPAN_PRIORITY
SPAN_USER
SPAN_USER_SHIFT

Ответ 1

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_USER и SPAN_USER_SHIFT - это области хранения для дополнительных пользовательских скалярных данных, которые будут храниться с диапазоном, если разработчик решит их использовать.