2016-08-13 13 views
7

Chúng tôi có một tùy chỉnh TagHandler trong ứng dụng của chúng tôi cho danh sách gạch đầu dòng, vvHtml Tag Handler không được gọi trong Android N cho "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)); 
} 

Các handleTag() chức năng trong TagHandler tôi được gọi là cho ul, li trong API-23 trở xuống nhưng không được gọi trong API-24 (Android N).

+1

Vui lòng cung cấp [mcve]. – CommonsWare

+0

@CommonsWare xin lỗi. Đã chỉnh sửa. – okmanideep

+0

_ "... nhưng không được gọi trong API-24 ..." _ Bạn đã chạy nó trên thiết bị Android N chưa? –

Trả lời

8

Hiển nhiên từ source của Html.java rằng, TagHandler.handleTag() chỉ được gọi nếu khung không tự xử lý.

Hiện tại, khuôn khổ dường như không xử lý tốt. Android N li tag handling

Nhưng ngay cả khi nó đã làm tốt, bạn vẫn muốn tùy chỉnh nó. Cách tốt nhất để giải quyết vấn đề này là thay thế các thẻ ul, li mặc định bằng thẻ của riêng bạn. Vì khung sẽ không xử lý các thẻ tùy chỉnh của bạn, nên TagHandler sẽ được yêu cầu xử lý thẻ.

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; 
} 

Và sau đó bạn có thể xử lý chuỗi html của bạn như

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

Đây không phải là không có sự cố. Ví dụ: nếu chuỗi đầu vào của bạn là phiên bản thẻ được thay thế của bạn như thế này, hãy xem

    ...
    ...
trình xử lý thẻ sẽ nhận chúng theo thứ tự sau: mở ol, mở ul, đóng ul, đóng ol. –

+1

@ bran.strat Tại sao lệnh thay đổi? – okmanideep

+0

bạn có thể thêm mã lớp 'CustomTagHandler' của mình –

-1

Tôi đã xuất bản một thư viện tương thích chuẩn hóa và backport lớp Html trên các phiên bản Android trong đó bao gồm nhiều callbacks cho các yếu tố và phong cách:

https://github.com/Pixplicity/HtmlCompat

Cụ thể, do sự thỉnh nguyện này:

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

bạn sẽ được quan tâm trong việc thực hiện TagHandler cho biết thẻ, và SpanCallback để tùy chỉnh nhịp rằng HtmlCompat tạo từ HTML.

Các vấn đề liên quan