Android Html.fromHtml(String) не работает

Я хочу установить String с эффектами HTML-тегов. Используя следующий метод, я не могу этого сделать. Это показывает мне нормальный текст.

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

Я передаю следующую строку в функцию;

vgdgffdgdgfdfgdfgdfgdfgdfg..........

aererwerewrwerwer

yyiyuiuuyuuyiyiuy

hjjgjhghghgjhgjhgj

  • gtttggttt
  • ghgggggg

Но когда я применяю Html.fromHtml(html); его возвращение следующей строки

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

Я запускаю свое приложение в эмуляторе с API 23

Пожалуйста, предоставьте какое-нибудь решение для обработки тегов HTML.

1 ответ

Решение

Android поддерживает некоторые HTML-теги. Вы можете увидеть поддерживаемые теги на Android.

Поддерживаемый HTML-тег на Android

Android не поддерживает теги ul и li. для этого вы должны обрабатывать теги, как показано ниже

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

}

Теперь вам просто нужно создать строку элемента списка с тегом ul или li, как показано ниже. В этом методе вам просто нужно передать массив строк, которые вы хотите отобразить в виде списка html.

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

Вы можете использовать как это:

textview.setText(Html.fromHtml(htmlString, null, new HtmlTagHandler()));
Другие вопросы по тегам