Странное поведение 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 ответа
Я решил эту проблему, добавив в начало строки "Столяр нулевой ширины"
Строка выглядит так:
"‍<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
Тег будет тем, который закрывается последним, а остальные вложенные теги будут работать нормально.