Странное поведение TagHandler при обнаружении открывающих и закрывающих тегов

Я пытаюсь использовать TextView для отображения текста строки с пользовательскими тегами:

Строка:

"<articlelink>text1</articlelink> padding<articlelink>text2</articlelink>"

Где articlelink - это пользовательский тег. Я использую настроенный HTML.TagHandler для обработки тегов:

private class MyTagHandler implements Html.TagHandler {

    private int startIndex = 0;
    private int endIndex = 0;

    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
        if (tag.equals("articlelink")) {
            if (opening) {
                startIndex = output.length();
                DebugLog.d("OPEN " + startIndex);
            } else {
                endIndex = output.length();
                DebugLog.d("END " + endIndex);
                MyClickableSpan span = new MyClickableSpan();
                output.setSpan(span, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
}

Однако журнал это:

OPEN 0
OPEN 13
END 18
END 18

Однако после того, как я вставлю символ перед строкой, результат будет таким, как я ожидал:

Строка:

"a<articlelink>text1</articlelink> padding<articlelink>text2</articlelink>"

ВЫХОД:

OPEN 1
END 6
OPEN 14
END 19

Что здесь случилось? Это ошибка или я ее неправильно использовал?

2 ответа

Я решил эту проблему, добавив в начало строки "Столяр нулевой ширины"

Строка выглядит так:

"&zwj;<articlelink>text1</articlelink>padding<articlelink>text2</articlelink>"

В результате просмотра текста этот символ не отображается, а текст выглядит как исходная строка

Я также столкнулся с этой проблемой при написании моего собственного TagHandler. Это кажется мне ошибкой Android. Несмотря на то, что вопрос старый, потому что по этому вопросу не так много информации, я все равно опубликую свое решение... оно может кому-то помочь.

Проблемный случай возникает, когда текст начинается с тега HTML (с индексом 0), обратный вызов метода "handleTag()" с флагом закрытия будет запущен, когда обработка достигнет конца текста.

Мой (довольно уродливый) обходной путь для этой проблемы состоял в том, чтобы использовать отдельные теги для открывания и закрывания отметок, например:

"<start>text1<end> padding<start>text2<end>"

Обратите внимание, что тег "end" не является закрывающим (ему не предшествует "/").

Сделав это, вам нужно будет изменить свою логику в методе handleTag () в следующем общем виде:

public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("start")) {
        // Handle opening of your tag
    } else if (tag.equalsIgnoreCase("end")) {
        // Handle closing of your tag
    }
}

Логический параметр "открытие" больше не нужен, а также будет корректно возвращен output.length(), поскольку проблема заключается только в закрывающем теге, который вы не будете использовать.

Загляните и в эту проблему, кажется, работает обернуть текст в <html>...</html>теги. Таким образомhtml Тег будет тем, который закрывается последним, а остальные вложенные теги будут работать нормально.

Другие вопросы по тегам