2016-08-13 35 views
7

Mamy zwyczaj TagHandler w naszej aplikacji do listy punktowanej itpHTML Tag Handler nie nazywa się Android N dla "UL", "Li"

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() funkcja w moim TagHandler nazywa dla ul, li w interfejsie API-23 i poniżej, ale nie wywoływanym w interfejsie API-24 (Android N).

+1

Proszę podać [mcve]. – CommonsWare

+0

@CommonsWare sorry. Edytowane. – okmanideep

+0

_ "... ale nie wywołano w API-24 ..." _ Czy uruchomiłeś go na urządzeniu z Androidem N? –

Odpowiedz

8

Jest oczywiste z source z Html.java, że, TagHandler.handleTag() jest wywoływana tylko wtedy, gdy struktura nie przetwarza go sama.

Obecnie struktura nie wydaje się dobrze jej przetwarzać. Android N li tag handling

Ale nawet jeśli zrobiło to dobrze, i tak chciałbyś to zmienić. Najlepszym sposobem na rozwiązanie tego problemu jest zastąpienie domyślnych tagów ul, li własnymi znacznikami. Ponieważ struktura nie będzie przetwarzać niestandardowych tagów, Twój użytkownik zostanie poproszony o jego obsługę przez 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; 
} 

a następnie można przetworzyć ciąg HTML jak

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()); 
} 
+0

Nie jest to również bez problemów. Na przykład, jeśli Twój łańcuch wejściowy jest zastąpioną wersją znacznika czegoś podobnego do tego:

    ...
    ...
, obsługa znaczników otrzyma je w następującej kolejności: otwórz ol, otwórz ul, zamknij ul, zamknij ol. –

+1

@ bran.strat Dlaczego zamówienie się zmieni? – okmanideep

+0

Czy możesz dodać kod klasy "CustomTagHandler" –

-1

Mam opublikowany biblioteki zgodności w celu ujednolicenia i backport klasę HTML całej Android wersje, które zawiera więcej wywołania zwrotne dla elementów i stylizacji:

https://github.com/Pixplicity/HtmlCompat

W szczególności, biorąc pod uwagę to wezwanie:

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

będziesz zainteresowany w realizacji TagHandler nieznanych znaczników i SpanCallback dostosowywania Przęsła że HtmlCompat tworzy z HTML.