androidhtmlfromhtml

Android Html.fromHtml(String) doesnt work


I want to set String with HTML tags effects. By using following method I am not able to do that. Its showing me normal text.

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }

I am passing following string to function;

vgdgffdgdgfdfgdfgdfgdfgdfg..........

aererwerewrwerwer

yyiyuiuuyuuyiyiuy

hjjgjhghghgjhgjhgj

  • gtttggttt
  • ghgggggg 

But when I apply Html.fromHtml(html); its return following string

vgdgffdgdgfdfgdfgdfgdfgdfg.......... aererwerewrwerwer yyiyuiuuyuuyiyiuy hjjgjhghghgjhgjhgj gtttggtttghgggggg

I am running my app in emulator with API 23

Please provide some solution to handle HTML tags.


Solution

  • Android support some Html tags. you can see supported tags by android.

    Supproted Html Tag by Android

    Android not support ul and li tags. for that you have to handle tags like below

    public class HtmlTagHandler implements Html.TagHandler {
    boolean first = true;
    String parent = null;
    int index = 1;
    private int mListItemCount = 0;
    private Vector<String> mListParents = new Vector<String>();
    
    @Override
    public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    
        if (tag.equals("ul") || tag.equals("ol") || tag.equals("dd")) {
            if (opening) {
                mListParents.add(tag);
            } else mListParents.remove(tag);
    
            mListItemCount = 0;
        } else if (tag.equals("li") && !opening) {
            handleListTag(output);
        } else if (tag.equalsIgnoreCase("code")) {
            if (opening) {
                output.setSpan(new TypefaceSpan("monospace"), output.length(), output.length(), Spannable.SPAN_MARK_MARK);
            } else {
                Log.d("COde Tag", "Code tag encountered");
                Object obj = getLast(output, TypefaceSpan.class);
                int where = output.getSpanStart(obj);
    
                output.setSpan(new TypefaceSpan("monospace"), where, output.length(), 0);
            }
        }
    
    }
    
    private Object getLast(Editable text, Class kind) {
        Object[] objs = text.getSpans(0, text.length(), kind);
        if (objs.length == 0) {
            return null;
        } else {
            for (int i = objs.length; i > 0; i--) {
                if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK) {
                    return objs[i - 1];
                }
            }
            return null;
        }
    }
    
    private void handleListTag(Editable output) {
        if (mListParents.lastElement().equals("ul")) {
            output.append("\n");
            String[] split = output.toString().split("\n");
    
            int lastIndex = split.length - 1;
            int start = output.length() - split[lastIndex].length() - 1;
            output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
        } else if (mListParents.lastElement().equals("ol")) {
            mListItemCount++;
    
            output.append("\n");
            String[] split = output.toString().split("\n");
    
            int lastIndex = split.length - 1;
            int start = output.length() - split[lastIndex].length() - 1;
            output.insert(start, mListItemCount + ". ");
            output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
        }
    }
    
    }
    

    Now you just have to create list item string with ul or li tag like below. In this method you just have to pass array of strings which you want to show as html list.

     public static String getHtmlText(String[] s) {
        String ulStart = "<ul>";
    
        for (int i = 0; i < s.length; i++) {
            ulStart += "<li>" + s[i] + "</li>";
        }
    
        ulStart += "</ul>";
        return ulStart;
    }
    

    You can use like this:

    textview.setText(Html.fromHtml(htmlString, null, new HtmlTagHandler()));