Обработчик HTML-тегов не вызывается в Android N для ul, li

У нас есть пользовательский TagHandler в нашем приложении для маркированного списка и т. д.

html = "<ul><li>First item</li><li>Second item</li></ul>";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY, null, new ListHTMLTagHandler(density));
} else {
  //noinspection deprecation
  result = Html.fromHtml(html, null, new ListHTMLTagHandler(density));
}

Функция handleTag() в моем TagHandler вызывается для ul, li в API-23 и ниже, но не вызывается в API-24 (Android N).


person okmanideep    schedule 13.08.2016    source источник
comment
Предоставьте минимально воспроизводимый пример.   -  person CommonsWare    schedule 13.08.2016
comment
@CommonsWare извините. Отредактировано.   -  person okmanideep    schedule 13.08.2016
comment
... но не вызывается в API-24... Вы запускали его на устройстве Android N?   -  person frogatto    schedule 13.08.2016
comment
Для этого есть ошибка в системе отслеживания ошибок Android. Пожалуйста, пометьте его для привлечения внимания. b.android.com/214637   -  person myanimal    schedule 13.09.2016
comment
@HiI'mFrogatto Да. Эмулятор и Nexus 5X с Android-N   -  person okmanideep    schedule 06.10.2016


Ответы (2)


Это видно из источник Html.java, что TagHandler.handleTag() вызывается только в том случае, если фреймворк не обрабатывает его сам.

В настоящее время фреймворк, похоже, плохо его обрабатывает. Обработка тегов Android N li

Но даже если он сделал это хорошо, вы все равно захотите его настроить. Лучший способ справиться с этим — заменить стандартные теги ul, li вашими собственными тегами. Поскольку фреймворк не будет обрабатывать ваши пользовательские теги, TagHandler будет предложено обработать его.

public static String customizeListTags(@Nullable String html) {
  if (html == null) {
    return null;
  }
  html = html.replace("<ul", "<" + UL);
  html = html.replace("</ul>", "</" + UL + ">");
  html = html.replace("<ol", "<" + OL);
  html = html.replace("</ol>", "</" + OL + ">");
  html = html.replace("<dd", "<" + DD);
  html = html.replace("</dd>", "</" + DD + ">");
  html = html.replace("<li", "<" + LI);
  html = html.replace("</li>", "</" + LI + ">");
  return html;
}

И затем вы можете обработать свою строку html, например

html = customizeListTags(html);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY, null, new CustomTagHandler());
} else {
  //noinspection deprecation
  result = Html.fromHtml(html, null, new CustomTagHandler());
}
person okmanideep    schedule 13.08.2016
comment
Это тоже не без проблем. Например, если ваша входная строка является замененной версией тега чего-то вроде этого ‹ol›...‹/ol›‹ul›…‹/ul›, обработчик тега получит их в следующем порядке: open ol, open ul , рядом ул, рядом ул. - person bran.strat; 14.09.2016
comment
@bran.strat Почему порядок изменился? - person okmanideep; 06.10.2016
comment
не могли бы вы добавить код класса CustomTagHandler - person Akash Raghav; 11.05.2017
comment
@AkashRaghav Вам необходимо реализовать интерфейс Html.TagHandler . Если вам нужен пример, я нашел его здесь - person okmanideep; 19.05.2017
comment
@VivekBarai это может быть любая строка, не являющаяся стандартным тегом в HTML. CustomUL, например. Это не может быть ul, ol или b и т. д., которые являются стандартными тегами в HTML. - person okmanideep; 29.06.2018

Я опубликовал библиотеку совместимости для стандартизации и поддержки класса Html в разных версиях Android, которая включает больше обратных вызовов для элементов и стилей:

https://github.com/Pixplicity/HtmlCompat

В частности, учитывая этот вызов:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
        imageGetter, tagHandler, spanCallback);

вам будет интересно реализовать TagHandler для неизвестных тегов и SpanCallback для настройки диапазонов, которые HtmlCompat создает из HTML.

person Paul Lammertsma    schedule 14.03.2017